美文网首页大前端时代
qiankun & @umijs/plugin-qiankun实

qiankun & @umijs/plugin-qiankun实

作者: 隐号骑士 | 来源:发表于2020-12-29 15:17 被阅读0次

    qiankun 是一个基于 single-spa微前端实现库
    umi 插件,提供了 @umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统。

    搭建主应用

    yarn create umi
    yarn add @umijs/plugin-qiankun -D

    注册qiankun

    config.js 添加qiankun配置项

    qiankun: {
        master: {
          // 注册子应用信息
          apps: [
            {
              name: 'app1', // 唯一 id
              entry: '//localhost:8081', // html entry
            },
          ],
        //   jsSandbox: true, // 是否启用 js 沙箱,默认为 false
        //   prefetch: true, // 是否启用 prefetch 特性,默认为 true
        },
      },
    
    引用子应用
    • 使用路由的方式
      config.js 的 router 配置中添加
    {
      name: 'app1',
      path: '/app1',
      microApp: 'app1', // 对应上一步注册中的name
    },
    
    • 使用组件的方式
      在组件中
    import { MicroApp } from 'umi';
    export function MyPage() {
      
      return (
        <div>
          <div>
            <MicroApp name="app1" /> 
          </div>
        </div>
      )
    }
    

    搭建子应用

    yarn create umi
    yarn add @umijs/plugin-qiankun -D

    注册qiankun

    config.js 添加qiankun配置项

      qiankun: {
        slave: {}
      }
    

    注册钩子 src/app.ts

    export const qiankun = {
        // 应用加载之前
        async bootstrap(props) {
          console.log('app1 bootstrap', props);
        },
        // 应用 render 之前触发
        async mount(props) {
          console.log('app1 mount', props);
        },
        // 应用卸载之后触发
        async unmount(props) {
          console.log('app1 unmount', props);
        },
      };
    

    排坑

    在config.js 中注册qiankun后运行项目,观察到react项目被渲染到了id为root-master/root-slave 的DOM节点,而非antdpro默认的id为root的DOM节点,然而在最新版本的antdpro中,#root节点已经被写了一些预设样式,如height:100% ,会将开启qiankun后的真正的应用试图“挤”到视窗下方,影响体验。


    DOM结构

    所以需要将相关的预设样式清除,需要调整的地方有src/document.ejs,src/global.less

    然后便可以继续愉快的玩耍了。

    通信

    主项目
    • 使用路由方式引用的

    主项目新建 src/app.ts

    // src/app.ts
    export function useQiankunStateForSlave() {
      const [masterState, setMasterState] = useState({});
     
      return {
        masterState,
        setMasterState,
      }
    }
    

    其中state的值可以自己定义。但是,由于app.ts 没有在<Provider> 内部,所以无法通过useSelector和useDispatch来获取主应用model中的值和dispatch方法。

    • 使用组件方式引用的

    通过props传值

    function MyPage() {
      const [name, setName] = useState(null);
      return <MicroApp name={name} onNameChange={newName => setName(newName)} />
    }
    
    子项目
    import { connectMaster } from 'umi';
    function MyPage(props) {
      return <div>{ JSON.strigify(props) }</div>;
    }
    export default connectMaster(MyPage);
    
    

    思考

    • 在实际业务中,子项目承担什么角色? 一整套应用 or 仅展示层?
    • 基础配置如何共享(如鉴权/用户信息)

    for umi2

    使用上个版本的qiankun插件
    https://github.com/umijs/umi-plugin-qiankun

    相关文章

      网友评论

        本文标题:qiankun & @umijs/plugin-qiankun实

        本文链接:https://www.haomeiwen.com/subject/zplfoktx.html