什么是微前端?
微前端提供了一种技术可以将多个独立的 web 应用聚合到一起,提供统一的访问入口。
微前端的思路把后端微服务的架构引入到前端,其核心是能够已业务为单位构建端到端的垂直架构,使等单个的团队能够独立自主的进行相关的开发。
微前端的核心思路 是 远程应用程序,包含组件/模块/包的运行时加载。对于用户而言,访问的是一个微前端的容器,容器加载运行在远程服务器上的应用,把这些远程应用作为 组件/模块/包 在 本地浏览器中加载。
- 组件是底层 UI 库的构建单元
- 模块是相应运行时的构建单元
- 包 是 依赖性解析器的构建单元
- 微前端 是 所提出的应用程序的构建快
微服务主要思路:
- 将应用分解为小的、互相连接的微服务,一个微服务完成某个特定功能
- 每个微服务都有自己的业务逻辑和适配器,不同的微服务,可以使用不同的技术去实现。
- 使用统一的网关进行配置
为什么需要微前端,优势?
随着业务复制度的上升,保体积越来越大,每个版本小需求功能都会导致项目的全量部署,测试,上线,费时费力,加剧了出错风险。
在微前端中,web 应用被拆分为多个模块,每个模块可独立开发、测试、部署。更改一个模块不会影响到其他模块。
拆分大应用为小应用,方便迭代更新,且兼容历史应用,实现增量开发
特点/优势
- 松耦合代码、独立部署
- 增量开发
- 团队自洽
- 通过路由进行跨应用程序通信
- 解决大型项目迭代问题
- 解决多团队技术栈不同的问题
如何实现微前端架构?
从构建的角度来看有两种,编译时构建、运行时构建
- 编译时微前端,通查将第三方库中的组件作为包,在构建时引入依赖。这种实现引入新的微前端需要重新编译,不够灵活。编译时的微前端可以通过webComponents,Monorepo实现。
- 运行时微前端, 一次加载或延迟加载 按需动态将微型前端注入到容器应用程序中。不需要构建,可以动态在代码中定义加载。
- Module Federation (webkpack5)中的新特性,主要用来解决多个应用之间代码共享问题。
具体实现方式?
基于 iframe 完全隔离的方案
- 简单,无需改造
- 完美隔离,js、css 都是独立的运行环境
- 无法保证路由状态,刷新后路由状态丢失
- 完全的隔离导致与子应用的交互变的困难
- 整个应用全量资源加载,性能差
基于 single-spa 路由劫持方案
- 通过劫持路由的方式来做子应用直接的切换,但计入方式需要融合自身路由,有一定的局限性
- qiankun 是对
single-spa
做了一层封装,通过import-html-entry
包 解析 HTML 获取资源路径,然后对资源进行解析、加载。
京东 micro-app 方案
- 借鉴
WebComponet
的思想,通过CustonmElement
结合 自定义的ShadowDom
, 将微前端封装成一个类webComponent
组件,从而实现微前端的组件化渲染
技术选型
- single-spa, 第一个微前端框架,其提供较为基础的 api,应用在实际项目中 需要进行大量封装且入侵性强,使用不方便。
- qiankun,阿里开源的,基于 single-spa 的上层封装,在国内生态较好,有先行者铺路
- EMP, 基于 module federation 实现的一套可以跨应用共享资源的框架,处理具备微前端的能力外,还实现了跨应用状态共享、跨框架组件调用的能力。