微前端乾坤项目vue集成子系统流程

发布时间:2024年01月15日
  1. 在 src 目录新增 public-path.js:
if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
  1. 入口文件 main.js 修改,为了避免根 id #app 与其他的 DOM 冲突,需要限制查找范围。
import './public-path';
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App.vue';
import routes from './router';
import store from './store';

Vue.config.productionTip = false;

let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/',
    mode: 'history',
    routes,
  });

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

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

export async function bootstrap() {
  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;
}

3.打包配置修改(vue.config.js):

const { name } = require('./package');
module.exports = {
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd', // 把微应用打包成 umd 库格式
      jsonpFunction: `webpackJsonp_${name}`, // webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal
    },
  },
};

4.路由配置:

import { registerMicroApps, runAfterFirstMounted, start, addGlobalUncaughtErrorHandler } from 'qiankun';

// 定义微应用
const apps = [
  {
    name: 'subapp1', // 微应用的名称
    entry: '//localhost:8081', // 微应用的入口 URL
    container: '#subapp-container', // 微应用挂载的容器
    activeRule: '/subapp1', // 触发微应用的规则
  },
  {
    name: 'subapp2',
    entry: '//localhost:8082',
    container: '#subapp-container',
    activeRule: '/subapp2',
  },
  // 根据需要添加更多微应用
];

// 注册微应用
registerMicroApps(apps, {
  beforeLoad: app => {
    console.log('加载微应用前:', app.name);
  },
  beforeMount: [
    app => {
      console.log('挂载微应用前:', app.name);
    },
  ],
  afterUnmount: [
    app => {
      console.log('卸载微应用后:', app.name);
    },
  ],
});

// 第一个微应用挂载后执行的回调
runAfterFirstMounted(() => {
  console.log('第一个微应用已挂载');
});

// 设置全局未捕获错误处理器
addGlobalUncaughtErrorHandler(event => {
  console.error('全局未捕获错误:', event);
});

// 启动应用
start();

export default apps;
// 主系统的路由配置文件

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

// 引入定义的微应用
import apps from './qiankun-config'; // 上面给出的包含微应用信息的文件

// 创建一个空的路由实例
const router = new Router({
  mode: 'history',
  routes: [
    // 其他主系统的路由...

    // 微应用的容器路由
    {
      path: '/subapps',
      component: {
        render: h => h('router-view'),
      },
      children: [],
    },
  ],
});

// 注册微应用的容器路由
apps.forEach(app => {
  router.options.routes[0].children.push({
    path: app.activeRule,
    name: app.name,
    component: () => import('@/views/MicroAppContainer'), // MicroAppContainer 是用于挂载微应用的组件
  });
});

export default router;

###主系统的url路由配置:

{
      name: '审批',
      id: '76aab9145475483b910e65f75,
      icon: '',
      path: '',
      activeRouters: [],
      auth: true,
      level: 1,
      children: [
        {
          name: '用户管理',
          activeRouters: [],
          auth: true,
          level: 2,
          id: '76aab9145475483b910e65f7',
          children: [
            {
              name: '用户列表',
              path: '/user/list',
              activeRouters: [],
              auth: true,
              level: 3,
              id: 'f5f974089e134bf39b86a348'
            }
          ]
        },
      ]
}

###子系统的url路由配置:

{
    path: '/user',
    component: () => import('@/user/list'),
    name: 'user',
    redirect: '/user',
    meta: {
      title: '用户管理',
      noCache: true,
      isTitleGoBack: true
    },
    children: [
      {
        path: '/user',
        name: 'user',
        component: () => import('@/user'),
        meta: {
          title: '用户列表',
          auth: true,
          activeMenu: '/work/user/list',
          noCache: true,
          mergeCode: 'user_list',
          isClearContentSpace: true,
          isTitleGoBack: true
        }
      },
    ]
  }
文章来源:https://blog.csdn.net/m0_46365130/article/details/135597107
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。