乾坤 vs Single-SPA

乾坤是基于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 来解析子应用静态资源地址,挂载到对应容器上
创建沙箱环境,查找子应用生命周期函数,初始化子应用


image.png
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、加载性能方面

应用多了之后每个子应用都是独立打包,资源重复加载问题明显

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容