微前端解决方案有哪些?
qiankun(乾坤)、飞冰( iceworks )、OnePiece、Magix、icestack、legaoLoader、umijs 根据乾坤整合了 @umijs/plugin-qiankun
微前端解决了什么?
解决历史遗留单页巨石应用(Frontend Monolith)的维护问题,分解应用的复杂度,降低项目的迁移维护风险;这才是人们采用微前端方案最重要的原因;
微前端的核心价值:
- 技术栈无关(提高扩展灵活性,不限于单一技术(组件不可替代)):
- 主框架不限制接入应用的技术栈,子应用可自由组合
- 独立开发、独立部署:
- 子应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新
- 独立运行时:
- 每个微应用之间状态隔离,运行时状态不共享
- 增量升级(分解应用复杂度,解耦各个子应用,降低开发风险):
- 在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略,可以减少或不重写原有代码,直接开发新的模块;
- 体系化方案解决(复用性强,降低开发维护成本):
- 微前端并非只是加载一个异步模块,改造应发的一系列问题通过体系化的方案解决;
微前端是什么?
微前端不是框架、不是工具/库,而是一套架构体系,它包括若干库、工具、中心化治理平台以及相关配套设施。
微前端包括 3 部分:
- 微前端的基础设施。这是目前讨论得最多的,一个微应用如何通过一个组件基座加载进来、脚手架工具、怎么单独构建和部署、怎么联调。
- 微前端配置中心:标准化的配置文件格式,支持灰度、回滚、红蓝、A/B 等发布策略。
微前端的可观察性工具:对于任何分布式特点的架构,线上/线下治理都很重要。
微前端具体要解决好的 11 个问题:
微应用的注册、异步加载和生命周期管理;
- 微应用之间、主从之间的消息机制,如何通讯;
- 微应用之间的安全隔离措施;
- 微应用的框架无关(同页面多个技术栈)、版本无关;
- 微应用之间、主从之间的公共依赖的库、业务逻辑(utils)以及版本怎么管理;
- 微应用独立调试、和主应用联调的方式,快速定位报错(发射问题);
- 微应用的发布流程;
- 微应用打包优化问题;
- 微应用专有云场景的出包方案;
- 渐进式升级:用微应用方案平滑重构老项目;
- 独立团队之间如何协作。
你可能会问直接用iframe?主要几个局限问题
iframe 的原生硬隔离方案无法突破,导致应用间上下文无法被共享,随之带来的开发体验、产品体验的问题。
- URL 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
- UI 不同步,DOM 结构不共享。想象一下屏幕右下角 1/4 的 iframe 里来一个带遮罩层的弹框,同时我们要求这个弹框要浏览器居中显示,还要浏览器 resize 时自动居中..
- 父子应用之间通信问题: iframe 存在通信费事费力问题
- 全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名都不同的子应用中实现免登效果。
- 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程(交互视图效果不佳)
iframe 隔离 vs 沙盒隔离
- iframe 是全独立模式,互补干扰;
- 沙盒是以隔离模式独立,而是有分享和协同的可靠环境;
JS Entry vs HTML Entry
App Entry | 优点 | 缺点 |
---|---|---|
HTML Entry | 1. 子应用开发、发布完全独立 2. 子应用具备与独立应用开发时一致的开发体验 |
1. 多一次请求,子应用资源解析消耗转移到运行时 2. 主子应用不处于同一个构建环境,无法利用 bundler 的一些构建期的优化能力,如公共依赖抽取等 |
JS Entry | 主子应用使用同一个 bundler,可以方便做构建时优化 | 1. 子应用的发布需要主应用重新打包 2. 主应用需为每个子应用预留一个容器节点,且该节点 id 需与子应用的容器 id 保持一致 3. 子应用各类资源需要一起打成一个 bundle,资源加载效率变低 |
样式隔离和 js 隔离请参考:https://segmentfault.com/a/1190000020122048
参考文档: