将一个vue2项目修改为子应用,可以在qiankun环境下作为子应用运行,也可以单独运行,具体步骤如下:
1、安装qiankun:

npm i qiankun -S

2、在src下添加public-path.js文件

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

3、如果出现__webpack_public_path__报错,修改package.json文件,添加以下代码:

"globals": {
      "__webpack_public_path__": true
}

4、修改vue.config.js

const path = require('path');
const { name } = require('./package');

function resolve(dir) {
    return path.join(__dirname, dir);
}

const port = 8981;

module.exports = {
    outputDir: 'dist',
    assetsDir: 'static',
    filenameHashing: true,
    devServer: {
        hot: true,
        disableHostCheck: true,
        port,
        overlay: {
            warnings: false,
            errors: true,
        },
        // 跨域
        headers: {
            'Access-Control-Allow-Origin': '*',
        },
    },
    // 自定义webpack配置
    configureWebpack: {
        resolve: {
            alias: {
                '@': resolve('src'),
            },
        },
        output: {
            // 把子应用打包成 umd 库格式(必须)
            library: `${name}-[name]`,
            libraryTarget: 'umd',
            jsonpFunction: `webpackJsonp_${name}`,
        },
    },
};

5、修改main.js,暴露主应用识别所需的三个必要的生命周期:

// public-path必须第一行就引入
import './public-path'
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'
import Antd from 'ant-design-vue'
// 原ant-design css
import 'ant-design-vue/dist/antd.css'
// 自定义全局主题样式
import './theam/ant-design-vue.js'
import cryptos from './utils/crypto'
import global_variable from "./utils/global_variable";
// 路由
import routes from './router'
// vuex
import store from './store/index.js'
import Vuex from 'vuex'
import VueRouter from 'vue-router';

Vue.config.productionTip = false;

const instances = axios.create({
  baseURL: '/week'
});

// 配置过滤response
instances.interceptors.response.use((response) => {
  if (response) {
    if (response.data.code === 'FALSE') {
      return 'FALSE';
    }
    return response;
  }
}, error => {
  return Promise.reject(error);
});

// 跨域请求时是否需要使用凭证
instances.defaults.withCredentials = true;

instances.defaults.headers.post['Content-Type'] = 'application/json';
instances.defaults.headers.get['Content-Type'] = 'application/json';

// 配置请求头
instances.defaults.headers.common['x-token'] = sessionStorage.getItem('login');
instances.defaults.headers.common['x-user-id'] = sessionStorage.getItem('userId');

Vue.prototype.$axios = instances;
Vue.use(Antd);
Vue.prototype.cryptos = cryptos;
Vue.prototype.BASEURL = global_variable.baseURL;
Vue.use(Vuex);

// new Vue({
//   router,
//   store,
//   render: h => h(App),
// }).$mount('#app');

Vue.config.productionTip = false;

let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? `${props.name}` : '/',
    mode: 'history',
    routes
  });
  instance = new Vue({
    router,
    store,
    render: h => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');
}

// webpack打包公共文件路径
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}
// 生命周期
export async function bootstrap(props) {
  const { foo, user } = props;
  sessionStorage.setItem('userInfo',JSON.stringify({foo, user}));
  console.log('[vue] vue app bootstraped');
}
export async function mount(props) {
  console.log('[vue] props from main framework', props);
  render(props);
}
export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}

6、修改路由:import Vue from ‘vue’

import Router from 'vue-router'

Vue.use(Router);


let routes = [{
    path: "/",
    name: "main", // 首页代码
    component: () => import("../components/main/MainComponent.vue"),
    meta: { breadcrumbName: '首页' },
},{
    path: "/main",
    name: "main", // 测试代码
    component: () => import("../components/navigation/Navigation.vue"),
    meta: { breadcrumbName: '测试' },
},{
    path: "/mainComponent",
    name: "mainComponent", // 首页代码
    component: () => import("../components/main/MainComponent.vue"),
    meta: { breadcrumbName: '登录' },
},{
    path: "/login",
    name: "loginComponent", // 首页代码
    component: () => import("../components/login/LoginComponent.vue"),
    meta: { breadcrumbName: '登录' },
}
];

if (!window.__POWERED_BY_QIANKUN__) {
    // 独立环境
    routes = [
        {
            path: '/',
            redirect: '/mainComponent',
            meta: { title: '首页' }
        },
        {
            path: '/main',
            component: () => import('../components/navigation/Navigation.vue'),
            meta: { title: '侧边栏仪表板' },
            children: [
                {
                    path: '/mainComponent',
                    component: () => import('../components/main/MainComponent.vue'),
                    meta: { title: '主页面' }
                },
                {
                    path: '/test',
                    component: () => import('../components/test/TestComponent.vue'),
                    meta: { title: '测试页面' }
                },
            ]
        },
        {
            path: '/login',
            component: () => import('../components/login/LoginComponent.vue'),
            meta: { title: '登录页' }
        },
        {
            path: '*',
            redirect: '/404'
        }
    ]
}

export default routes;
Logo

前往低代码交流专区

更多推荐