qiankun 微前端的一些总结
date
Feb 7, 2023
slug
qiankun
status
Published
tags
微前端
summary
type
Post
中 M微前端是基于 JS Entry和 qiankun这种区别比较大,今天有空看看 qiankun具体是怎么做。
路由特点
基于 Single-Spa,路由机制核心围绕「路由劫持 / 监听」实现子应用的加载、切换、卸载。主应用仅做路由监听和调度,子应用拥有独立的路由系统,本质是多应用的路由协同。
分 history和 hash两种模式,history中监听 popstate实现各应用间跳转,一般 会pushState/replaceState方法,达到监听所有history方法。
HTML Entry vs JS Entry
样式隔离
- scoped css,为每个 子应用添加样式前缀
- 如需更彻底的隔离,可手动开启 Shadow DOM 模式,qiankun 会自动将子应用挂载到 Shadow Root 中。
- 若子应用有依赖全局 DOM 的逻辑(如
document.body.appendChild),需适配 Shadow DOM(通过shadowRoot替代document);
- IE 浏览器不支持 Shadow DOM,需做好降级。
样式存在的一些问题
- 子应用全局样式仍污染主应用:
- 原因:qiankun 的自动前缀对
body/html等根选择器的处理有限; - 解决:子应用尽量避免写全局样式,或手动给全局样式添加前缀,如:
css
/* 子应用内推荐写法 */
.app1-wrapper body { background: #fff; }- Shadow DOM 下第三方库样式失效:
- 原因:第三方库样式挂载到
document.head,不在 Shadow DOM 内; - 解决:qiankun 提供了
appendCssLinkToShadowDom配置,自动将样式注入 Shadow Root:
javascript
运行
sandbox: {
strictStyleIsolation: true,
appendCssLinkToShadowDom: true, // 自动将子应用 CSS 注入 Shadow DOM
}- 主应用样式覆盖子应用:
- 原因:主应用样式优先级高于子应用自动前缀样式;
- 解决:子应用样式添加
!important(谨慎使用),或主应用给全局样式添加作用域限制。
js隔离