简介
- 微前端: 由微服务衍生而来
- 微前端架构中一般会有个容器应用(container application)将各子应用(Bundle)集成起来 ^1
- 多 Bundle 集成方式
- 服务端集成:如服务端渲染SSR
- 构建时集成:如Code Splitting
- 常见的构建时集成方式是将子应用发布成独立的 npm 包,共同作为主应用的依赖项,构建生成一个供部署的 JS Bundle。然而,构建时集成最大的问题是会在发布阶段造成耦合,任何一个子应用有变更,都要整个重新编译
- 运行时集成:如通过 iframe、JS、Web Components 等方式
- iframe实现缺点:https://www.yuque.com/kuitos/gky7yw/gesexv
- SPA(SinglePage Web Application)单页应用和MPA(MultiPage Application)多页应用区别参考:https://juejin.cn/post/6844903512107663368
- 相关资源
- TODO
- 相关框架
Wujie
- 腾讯
- 特点
- 基于 WebComponent 容器 + iframe 沙箱,子应用运行在 iframe 中,利用 Shadow DOM 实现 CSS 隔离,JS 天然隔离于 iframe 上下文
- 适合追求低接入成本,适用于快速迭代和混合技术栈的项目
Qiankun
- 蚂蚁金服qiankun(乾坤)
- 基于single-spa实现
- 主应用通过
history.pushState(state, title[, url])跳转到微应用 - 基于Fetch(类似ajax)获取微应用页面,并将其加入到相应DOM(此时是同一个域),因此微应用可以获取到主应用的所有状态(Cookies/Storeage) ^2
- 由于主应用和微应用最终输入同源页面,因此所有状态(Cookies/Storeage)共享,对于不想共享的数据可增加key前缀区分
- 相关文章
多应用部署及路由流程
1 | ## 整体流程 |
沙箱隔离
- 由于主应用和子应用在同一个窗口,因此不进行沙箱隔离,则主子应用访问到同一个window,可能导致数据混乱
- qiankun 做沙箱隔离主要分为三种:legacySandBox、proxySandBox、snapshotSandBox
- 其中 legacySandBox、proxySandBox 是基于 Proxy API 来实现的,在不支持 Proxy API 的低版本浏览器中,会降级为 snapshotSandBox。在现版本中,legacySandBox 仅用于 singular 单实例模式,而多实例模式会使用 proxySandBox
- proxySandbox
1 | function createFakeWindow(global: Window) { |
常见问题
- 报错:Application died in status LOADING_SOURCE_CODE: You need to export the functional lifecycles in xxx entry
- 参考:https://qiankun.umijs.org/zh/faq
- 有可能vue.config.js配置的入口函数存在问题,没有将main.js写成入口函数的最后一个文件,参考webpack.md#复杂案例
- 子项目不支持动态路由(动态从服务端获取路由配置,通过addRoutes加入路由),基于vue暂未找到方案。https://www.yuque.com/blueju/blog/uxlrlr
icestark飞冰
- 飞冰icestark,为飞冰(ice生态的一个微前端解决方案
- 主应用和微应用皆支持 React/Vue/Angular… 等不同框架
- 支持VSCode拖拽组件
参考文章
