qiankun接入简易教程(vue 2.0 + react 17)

  • ~4.11K 字
  • 0 次阅读 次阅读
  • 0 评论 条评论
  1. 1. 主项目(Vue2+Webpack)
    1. 1.0.1. 1.安装 Qiankun
    2. 1.0.2. 2.注册子应用
    3. 1.0.3. 3.添加容器节点
    4. 1.0.4. 4.配置路由
  • 2. 子项目(React 17+Vite)
    1. 2.0.1. 1.安装 vite-plugin-qiankun
    2. 2.0.2. 2.配置 vite.config.js
    3. 2.0.3. 3.修改入口文件(src/main.jsx)
    4. 2.0.4. 4.调整路由配置(src/App.jsx)
  • 2.1. 参考资料

  • 本方案以Vue+Webpack作为主项目,React 17+Vite作为子项目接入,不保证其他人能正常接入,请根据实际自行选择

    主项目(Vue2+Webpack)

    1.安装 Qiankun

    1
    npm install qiankun -S

    2.注册子应用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import { registerMicroApps, start } from 'qiankun';
    const mountedApps = []//记录已经加载过的子应用
    // 第一次匹配到子应用时加载,加载过的不处理
    function genActiveRule(routerPrefix){
    return (location)=>{
    if(location.hash.startsWith(`#/${routerPrefix}`)){
    if(!mountedApps.includes(routerPrefix)){
    mountedApps.push(routerPrefix)
    }
    return true
    }
    return mountedApps.includes(routerPrefix)
    }

    }
    registerMicroApps([
    {
    name: 'uecenter', // 子应用名称
    entry: '//dev-uecenter.szlcsc.com:3001', // 子应用入口(开发环境用本地服务)
    container: '#subapp-container', // 挂载容器
    activeRule: genActiveRule('uecenter'), // 激活路径
    props: { /* 可传递全局数据 */ }
    }
    ]);

    // 启动 Qiankun
    start({
    prefetch:false,
    sandbox:false,
    singular:false
    });

    3.添加容器节点

    在需要展示子应用的 Vue 组件中,如layout.vue:

    1
    2
    3
    <template>
    <div id="subapp-container"></div>
    </template>

    4.配置路由

    1
    2
    3
    4
    5
    6
    7
    8
    {
    path: '*',
    name:'root',
    meta:{
    isSubApp:true
    },
    component: () => import('@/views/layout.vue') // 包含容器的组件
    }

    子项目(React 17+Vite)

    1.安装 vite-plugin-qiankun

    1
    npm install vite-plugin-qiankun -S

    2.配置 vite.config.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    // vite.config.js
    import { defineConfig } from 'vite';
    import react from '@vitejs/plugin-react';
    import qiankun from 'vite-plugin-qiankun';
    // 开发者模式无法引入react插件,需要手动每个页面引入,详见:https://github.com/umijs/qiankun/issues/1257
    const useDevMode = true
    export default defineConfig({
    plugins: [
    !useDevMode&&react(), // 开发者模式
    qiankun('uecenter', { // 子应用名称(需与主应用注册的 name 一致)
    useDevMode: true, // 开发模式下启用
    }),
    ],
    server: {
    port: 3001, // 指定端口(需与主应用 entry 配置一致)
    host:'0.0.0.0',
    cors:true // 允许跨域访问
    },
    base: '/', // 开发环境用/,生产环境用域名+端口
    build: {
    outDir: 'dist',
    rollupOptions: {
    output: {
    format: 'umd', // 必须为 umd 格式
    entryFileNames: 'assets/[name].[hash].js',
    },
    }
    },
    });

    3.修改入口文件(src/main.jsx)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // src/main.jsx
    import React from 'react';
    import ReactDOM from 'react-dom/client';
    import App from './App';
    import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper';

    function render(props){
    const container = props.container?props.container.querySelector('#root'):document.getElementById('root')
    ReactDOM.render(
    <App />,
    container
    )
    }

    // 独立运行
    if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
    render({});
    } else {
    // qiankun环境运行
    renderWithQiankun({
    mount(props) {
    console.log('mount');
    render(props);
    },
    bootstrap() {
    console.log('bootstrap');
    },
    unmount(props) {
    console.log('unmount');
    const container = props.container?props.container.querySelector('#root'):document.getElementById('root')
    ReactDOM.unmountComponentAtNode(
    container
    );
    },
    });
    }

    4.调整路由配置(src/App.jsx)

    如果子项目使用 React Router,需动态设置 basename:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // src/App.jsx
    import { BrowserRouter,HashRouter } from 'react-router-dom'; //这里使用的路由模式要与主项目一致
    import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper';
    import RenderRouter from './routers'

    function App() {
    return (
    <HashRouter basename={window.__POWERED_BY_QIANKUN__ ? '/uecenter' : '/'}>
    <RenderRouter />
    </HashRouter>
    );
    }

    参考资料

    vite-plugin-qiankun
    qiankun-issues-1257
    skywalk94/qiankun-demo

    打赏
    打赏提示信息
    分享
    分享提示信息