乾坤是基于Single-SPA封装的实现的前端微服务框架。本质上还是路由分发式的服务框架,不同于single-spa使用 js entry加载子应用的方案, 乾坤使用html entry来进行替代优化。
1、Js Entry的使用限制要求
- 限制一个js入口文件
- 图片、css等静态资源要打包到一个js文件中。使得js文件巨大,影响加载性能
- code splitting(按需加载)无法使用。
代码分割的核心优势-减小初始包的体积、实现按需加载、提高缓存利用率,但是在js entry模式下完全无法实现,因为用户首次访问时必须必须下载整个子应用的所有代码,即使他们只需要用到一小部分功能
2、Html Entry的使用限制要求
子应用就可以充分利用Webpack、Vite等工具的代码分割能力
- 主应用直接请求子应用发布的html文件,然后像浏览器一样解析其中的<script>和<link>标签,获取到所有分离的JS和CSS资源
- 子应用可以像普通单页应用一样自由地进行代码分割(例如,使用import()语法实现路由懒加载),生产多个独立的chunk文件,主应用通过html entry能正确识别并加载分割后的资源, 从而使代码分割技术得以完美应用。
- HTML Entry 则是使用 HTML 格式进行子应用资源的组织,主应用通过 Fetch html 的方式获取子应用的静态资源,同时将 HTML Document 作为子节点塞到主应用的容器中。可读性和维护性更高,更接近最后页面挂载后的效果,也不存在需要双向转义的问题。
3、qiankun 注册子应用的过程:
依赖注入后,会先初始化标识变量参数 xx_QIANKUN__,用于子应用判断所处环境等
当 qiankun 会通过 activeRule 的规则来判断是否激活子应用
activeRule 为字符串时,以路由拦截方式进行自主拦截
activeRule 为函数时,根据函数返回值判断是否激活
当激活子应用时,会通过 HTML-Entry 来解析子应用静态资源地址,挂载到对应容器上
创建沙箱环境,查找子应用生命周期函数,初始化子应用

3.1、CSS 样式错乱
由于默认情况下 qiankun 并不会开启 CSS 沙箱进行样式隔离,当主应用和子应用产生样式错乱时,我们可以启用 { strictStyleIsolation: true } 配置开启严格隔离样式,这个时候会用 Shadow Dom 节点包裹子应用,相信大家看到这个也很熟悉,和微信小程序中页面和自定义组件的样式隔离方案一致。
3.2、另外,在接入过程中,总结了几个需要注意的点
虽然 qiankun 支持 jQuery,但对多页应用的老项目接入不是很友好,需要每个页面都修改,成本也很高,这类老项目接入还是比较推荐 iframe ;
因为 qiankun 的方式,是通过 HTML-Entry 抽取 JS 文件和 DOM 结构的,实际上和主应用共用的是同一个 Document,如果子应用和主应用同时定义了相同事件,会互相影响,如,用 onClick 或 addEventListener 给 添加了一个点击事件,JS 沙箱并不能消除它的影响,还得靠平时的代码规范
部署上有点繁琐,需要手动解决跨域问题
3.3、加载性能方面
应用多了之后每个子应用都是独立打包,资源重复加载问题明显