大前端时代

qiankun & @umijs/plugin-qiankun实

2020-12-29  本文已影响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
    },
  },
引用子应用
{
  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);

思考

for umi2

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

上一篇 下一篇

猜你喜欢

热点阅读