微前端
February 15, 2023
概念 #
微前端是一个架构理念
适用场景 #
- 把一个大系统,拆成若干小的子系统,分开去迭代维护
- 把若干分散的子系统(不同或同一技术栈)合在一起,避免过多的跳转
实现方案 #
iframe #
优点:先天隔离,成本最低
缺点:性能低、通信复杂、双滚动条、弹窗问题(无法全局覆盖?)
npm 包 #
子应用拆成 npm 包
优点:性能和兼容性上是最优的方案
缺点:版本管理,包更新后,包的使用方是否需要同步更新?
single-spa #
渲染原理:路由监听, 监听 url change 事件
出现最早、最有影响力的微前端框架
qiankun #
阿里出的
在 single-spa 基础上进行了封装,提供了js沙箱、样式隔离、预加载等功能,并且与技术栈无关,可以兼容不同的框架
渲染原理:路由监听, 监听 url change 事件
html 作为资源入口,通过加载远程 html,解析其DOM结构从而获取js、css等静态资源来实现微前端的渲染,这也是qiankun目前采用的渲染方案。
缺点: 接入成本高
主子应用通信:
import { initGlobalState, MicroAppStateActions } from 'qiankun';
// 主应用初始化 state
const actions: MicroAppStateActions = initGlobalState(state);
actions.onGlobalStateChange((state, prev) => {
// state: 变更后的状态; prev 变更前的状态
console.log(state, prev);
});
actions.setGlobalState(state);
actions.offGlobalStateChange();
// 子应用从生命周期 mount 中获取通信方法,使用方式和 master 一致
export function mount(props) {
props.onGlobalStateChange((state, prev) => {
// state: 变更后的状态; prev 变更前的状态
console.log(state, prev);
});
props.setGlobalState(state);
}
micro app #
原理: CustomElement, 类 WebComponent + HTML Entry
Module Federation #
样式隔离 #
目的:主应用和子应用的样式互不影响
-
框架层处理缺点: 只能保证子应用的
-
用 cssModule 之类的工具或团队之间协商好样式前缀,从源头解决问题