从零实现一个微前端框架,前端项目的掌握能力。
微前端框架,包括应用开发,框架开发,后端服务,微前端发布平台。
微前端主要应用场景:PC端中后台
微前端架构
- 主应用,路由分发
- 统一调度和管理子应用
- 注册子应用,获取数据,例如菜单数据
- 子应用
- 后端服务和应用如何发布?
- Node BFF;例如 midwayjs
- 发布平台
- cdn版本控制
微前端好处
- 技术栈无关,主框架不限制接入应用的技术栈
- 独立开发,独立部署
- BFF层提供微前端管理的能力,配置化的接入微前端体系
- 对接成本,学习成本
- 支持增量发布,渐进式重构
- 更多的应用场景,软件系统可以分成独立的部分,精心分解的领域
- 每个子应用可以独立运行,集成支持应用之间的隔离
- 研发体验一致
- UI 样式风格统一
- 开发模式复用,例如:apm 埋点,问题排查,前端监控上报
- 子项目相似的代码,相似的风格对后面 codereview 和维护会更方便
- 组件库的复用
- 基础组件,业务组件,工具函数可被复用
跨团队维护场景
跨团队维护场景,比如一个系统分多个子系统
每个子系统由不同的团队维护,可能跨部门团队、外包,甚至 ISV,技术栈上可以要求一致,
但发布节奏会不同,并且跨团队的沟通成本高,所以技术闭环是比较好的方式,每个子应用保留自己的测试、CI、构建、部署等流程。
每个子功能是一个文件,格式可以是 umd 或 amd,然后按需加载子功能的文件实现。这一类,可以归为运行时的插件系统。
微前端缺点
- 前端项目拆分太多,不好维护
- 一个功能拆分太细,导致跨越多个项目进行开发
- CSS样式冲突
- 集成难度高
首次加载
- 注册子应用
- 公共事件管理
- 异常捕获
- 全局状态管理
路由更新,子应用是否匹配当前的路由
- MATCH 路由匹配
- 加载子应用,卸载上一个子应用
- 执行,解析子应用
- 渲染子应用
- NoMatch
- return
主应用
- nav导航菜单
- header头部信息
- 面包屑导航
- 定制化主题
各个子项目之间是解耦的,独立开发和部署,相互没有影响;
微前端架构
- 应用之间的通信
- 子应用的注册
- 公共的样式,状态管理
- 沙箱隔离
异常的捕获
主应用控制路由匹配,和子应用加载
- 共享依赖加载
- 子应用做功能,并接入主应用,试下联动控制
main主应用
https://juejin.cn/post/6943763969576271879
- 注册子应用
- 加载,渲染子应用
- 将子应用渲染在固定的容器里面
- 异常的捕获和报错处理
- 路由更新匹配 rules,active
- 获取数据,鉴权处理
- 加载全局依赖
- 父子应用通信机制
如果不做按需加载,需要在主应用把所有子应用的 JS 和 CSS 都引入,
不仅是性能上的问题,JS 沙箱的方案会更加复杂,
CSS 隔离可能只能通过约定和 css modules 的方式实现,而无法处理通用的场景
子应用
- 渲染页面
- 监听通信,主应用传递的数据
服务端发布
- eggjs跨域代理
- 登录鉴权