1 qiankun

1.1 使用1

00.微前端架构概述
    a.核心概念
        a.主应用(Base App)
            负责全局路由、状态管理和子应用调度。
        b.子应用(Micro App)
            独立开发、部署的业务模块,支持不同技术栈。
        c.通信机制
            主应用与子应用间通过 props 或全局状态共享数据。

01.环境准备
    a.创建主应用
        # 使用 Vite 快速创建 Vue3 项目
        npm create vue@latest main-app
        cd main-app
        npm install qiankun -S
    b.创建子应用
        npm create vue@latest micro-vue-app

02.主应用配置
    a.注册子应用
        在 src/micro/apps.ts 中定义子应用信息
        -----------------------------------------------------------------------------------------------------
        // apps.ts
        export default [
          {
            name: 'micro-vue-app',
            entry: '//localhost:7101', // 子应用开发环境地址
            container: '#subapp-container',
            activeRule: '/micro-vue',
          },
        ];
    b.启动 Qiankun
        修改 main.ts。
        -----------------------------------------------------------------------------------------------------
        import { createApp } from 'vue';
        import { registerMicroApps, start } from 'qiankun';
        import App from './App.vue';
        import apps from './micro/apps';

        const app = createApp(App);

        // 注册子应用
        registerMicroApps(apps);

        // 启动 qiankun
        start({
          prefetch: 'all', // 预加载子应用
          sandbox: { experimentalStyleIsolation: true }, // 样式隔离
        });

        app.mount('#main-app');
    c.路由配置
        修改 router/index.ts,确保主应用路由不干扰子应用。
        -----------------------------------------------------------------------------------------------------
        const router = createRouter({
          history: createWebHistory(import.meta.env.BASE_URL),
          routes: [
            { path: '/', component: HomeView },
            { path: '/micro-vue/*', component: () => import('@/views/MicroContainer.vue') },
          ],
        });

03.子应用改造
    a.导出生命周期钩子
        在子应用入口文件 src/main.ts 中。
        -----------------------------------------------------------------------------------------------------
        import { createApp } from 'vue';
        import App from './App.vue';

        let instance: any = null;

        function render(props: any) {
          const { container } = props;
          instance = createApp(App);
          instance.mount(container?.querySelector('#app') || '#app');
        }

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

        // 导出 Qiankun 生命周期
        export async function bootstrap() {
          console.log('Vue子应用启动');
        }

        export async function mount(props: any) {
          render(props);
        }

        export async function unmount() {
          instance.unmount();
          instance = null;
        }
    b.配置打包工具(Vite)
        修改 vite.config.ts。
        -----------------------------------------------------------------------------------------------------
        export default defineConfig({
          base: '/micro-vue', // 与主应用 activeRule 匹配
          server: {
            port: 7101,
            cors: true,
          },
          build: {
            rollupOptions: {
              output: {
                format: 'system', // 使用 SystemJS 格式
              },
            },
          },
        });
        ---
    c.添加 publicPath 适配
        在子应用根目录创建 public-path.js。
        -----------------------------------------------------------------------------------------------------
        if (window.__POWERED_BY_QIANKUN__) {
          __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
        }

04.主应用与子应用通信
    a.主应用传递数据
        注册子应用时添加 props。
        -----------------------------------------------------------------------------------------------------
        registerMicroApps(apps, {
          beforeLoad: (app) => {
            return {
              ...app,
              props: { globalToken: '主应用传递的Token' },
            };
          },
        });
    b.子应用接收数据
        在子应用 mount 生命周期中获取。
        -----------------------------------------------------------------------------------------------------
        export async function mount(props: any) {
          console.log('接收主应用数据:', props.globalToken);
          render(props);
        }

05.常见问题
    a.结构示例
        ├── main-app/            # 主应用
        │   ├── src/
        │   │   ├── micro/       # 微前端配置
        │   │   └── views/MicroContainer.vue
        ├── micro-vue-app/       # Vue3子应用
        │   ├── src/
        │   │   └── main.ts      # 导出生命周期
    b.样式隔离
        方案一:开启 sandbox: { experimentalStyleIsolation: true }(添加样式前缀)
        方案二:使用 CSS Modules 或 Shadow DOM
    c.公共依赖处理
        通过 webpack 的 externals 或 Vite 的 build.rollupOptions.external 共享公共库(如 Vue3)。
    d.子应用独立路由
        子应用需使用 createWebHistory 并配置 base。
        -----------------------------------------------------------------------------------------------------
        const router = createRouter({
          history: createWebHistory(window.__POWERED_BY_QIANKUN__ ? '/micro-vue' : '/'),
        });

1.2 使用2

01.架构设计
    a.主应用(基座)
        负责全局路由、权限、状态管理,以及子应用的加载
    b.子应用
        包括Vue2、Vue3和React16子系统,独立仓库管理
    c.公共依赖管理
        共享工具库和样式规范

02.实施步骤
    a.搭建主应用基座
        使用Vue3或纯JavaScript
        配置微前端环境,注册子应用并启动
        import { registerMicroApps, start } from 'qiankun';
        registerMicroApps([
          { name: 'vue2-app', entry: '//localhost:7101', container: '#subapp-container', activeRule: '/vue2' },
          { name: 'vue3-app', entry: '//localhost:7102', container: '#subapp-container', activeRule: '/vue3' },
          { name: 'react16-app', entry: '//localhost:7103', container: '#subapp-container', activeRule: '/react16' }
        ]);
        start({
          prefetch: 'all',
          sandbox: { experimentalStyleIsolation: true }
        });
    b.子应用改造(以Vue2为例)
        配置子应用的生命周期钩子和Webpack。
        // vue2-app/src/public-path.js
        if (window.__POWERED_BY_QIANKUN__) {
          __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
        }
        // vue2-app/src/main.js
        let instance = null;
        function render(props = {}) {
          const { container } = props;
          instance = new Vue({
            router,
            store,
            render: h => h(App)
          }).$mount(container ? container.querySelector('#app') : '#app');
        }
        export async function bootstrap() {}
        export async function mount(props) { render(props); }
        export async function unmount() { instance.$destroy(); instance.$el.innerHTML = ''; instance = null; }
        Webpack配置:
        module.exports = {
          devServer: {
            headers: { 'Access-Control-Allow-Origin': '*' }
          },
          configureWebpack: {
            output: {
              library: `vue2App`,
              libraryTarget: 'umd',
              jsonpFunction: `webpackJsonp_vue2App`
            }
          }
        };
    c.解决多框架冲突
        样式隔离:启用qiankun的样式沙箱,使用CSS Modules
        JS沙箱:启用严格样式隔离和Shadow DOM
        公共依赖处理:使用externals配置共享依赖
    d.路由统一管理
        主应用处理一级路由,子应用处理子路由
        // main-app/src/router.js
        const routes = [
          { path: '/vue2/*', name: 'vue2', meta: { title: 'Vue2子系统' } },
          { path: '/vue3/*', name: 'vue3', meta: { title: 'Vue3子系统' } },
          { path: '/react16/*', name: 'react16', meta: { title: 'React16子系统' } }
        ];
    e.部署优化策略
        独立部署:每个子应用单独构建,主应用通过Nginx配置反向代理
        资源预加载:按需预加载子应用资源
        性能监控:集成监控SDK,监控子应用性能