时间:2022-08-11 16:45:02 | 来源:网站运营
时间:2022-08-11 16:45:02 来源:网站运营
距 qiankun 开源已过去了 11 个月,距上次官方 发声 已过去 8 个月。Announcing qiankun@2.0
import { MicroApp } from 'umi';function MyPage() { return ( <div> <MicroApp name="qiankun"/> </div> );}
发布日志window
上新增了个属性 test
,这个属性只能在 A 应用自己的作用域通过 window.test
获取到,主应用或者其他微应用都无法拿到这个变量。但是注意,页面上不能同时显示多个依赖于路由的微应用,因为浏览器只有一个 url,如果有多个依赖路由的微应用同时被激活,那么大概率会导致其中一个 404。为了更方便的同时装载多个微应用,我们提供了一个全新的 API
loadMicroApp
,用于手动控制微应用:import { loadMicroApp } from 'qiankun';/** 手动加载一个微应用 */const microApp = loadMicroApp( { name: "microApp", entry: "https://localhost:7001/micro-app.html", container: "#microApp" })// 手动卸载microApp.mountPromise.then(() => microApp.unmount());
这也是 qiankun 作为一个应用加载器的使用方式。class MicroApp extends React.Component { microAppRef = null; componentDidMount() { const { name, entry } = this.props; this.microAppRef = loadMicroApp({ name, entry, container: '#container' }); } componentWillUnmount() { this.microAppRef.mountPromise.then(() => this.microAppRef.unmount()); } render() { return <div id="container"/>; }}
注意,由于快照沙箱不能做到互相之间的完全独立,所以 IE 等环境下我们不支持多应用场景,singlur
会被强制设为 true。
sandbox: { strictStyleIsolation?: boolean }
。import { loadMicroApp } from 'qiankun'loadMicroApp({xxx}, { sandbox: { strictStyleIsolation: true } });
Shadow DOM 可以做到样式之间的真正隔离(而不是依赖分配前缀等约定式隔离),其形式如下:图片来自 MDN在开启
strictStyleIsolation
时,我们会将微应用插入到 qiankun 创建好的 Shadow Tree 中,微应用的样式(包括动态插入的样式)都会被挂载到这个 Shadow Host 节点下,因此微应用的样式只会作用在 Shadow Tree 内部,这样就做到了样式隔离。Modal
就会渲染节点至 ducument.body
,引发样式丢失;针对刚才的 antd 场景你可以通过他们提供的 ConfigProvider.getPopupContainer
API 来指定在 Shadow Tree 内部的节点为挂载节点,但另外一些其他的组件库,或者你的一些代码也会遇到同样的问题,需要你额外留心。import { initGloabalState } from 'qiankun';initGloabalState({ user: 'kuitos' });
微应用通过 props 获取共享状态并监听:export function mount(props) { props.onGlobalStateChange((state, prevState) => { console.log(state, prevState); });};
更详细的 API 介绍可以查看官方文档。import { registerMicroApps } from 'qiankun'registerMicroApps( [ { name: 'react16', entry: '//localhost:7100',- activeRule: location => location.pathname.startsWith('/react'),+ activeRule: '/react',- render: renderFn,+ container: '#subapp-viewport', }, ])
现在你可以简单的指定一个挂载节点即可,而不用自己手写对应的 render 函数了。简单场景下 activeRule
配置也不需要再手写函数了(当然还是支持自定义函数),只需要给出一个前缀规则字符串即可,同时支持 react-router 类的动态规则,如 /react/:appId/name
(来自 single-spa 5.x 的支持)。props
中会新增一个 container
属性,这就是你的挂载节点的 DOM,这对处理动态添加的容器以及开启了 Shadow DOM 场景下非常有用。注意,旧的 render 配置依然可以使用,我们做了兼容处理方便不想升级的用户;但 render 存在时,container 就不会生效。
import { start } from 'qiankun'start({- jsSandbox: true,+ sandbox: {+ strictStyleIsolation: true+ }})
loadMicroApp
/** 用于加载一个微应用 */loadMicroApp(app: LoadableApp, configuration?: FrameworkConfiguration)
使用详情可见上面 多应用支持 小节。本文第一作者 @小氢气
关键词:解决,方案,完善,目标