导读
背景
可以看到,当我们把各个业务模块放在同一个项目中时,随着业务的迭代及增加时,有如下问题:
2,项目迭代优化某个模块部署升级需全量进行,容错性低;
3,项目太大,文件越来越多,文件结构不受控制,业务开发寻找变得也越来越困难。
1. 需求分析
2. 方案选择
对于此类项目。在微前端方案中,有多种方案,如下图所示各个方案的分析:
3. 架构设计
参考《从入门到微前端》一书中,可以看到微前端设计理念:
1) 中心化路由:就是我们需要有一个地方来管理我们的应用,发现存在哪些路由,哪个应用使用哪个路由,管理好我们的路由,实际上就是管理好我们的应用
2) 标识化应用:根据康威定律,就是在同一个组织下,不可能有两个项目名称是一样的
3) 生命周期:qiankun基于Single-SPA封装的库,因此它延用了一个基本的声明周期,它包含五种状态:
lload,决定加载哪个应用,并绑定生命周期
lbootstrap,获取静态资源
lmount, 删除应用的生命周期
lunload,删除应用的生命周期
lunmount,卸载应用,如删除DOM节点
4) 标独立部署,配置自动化
基于以上微前端设计理念,系统的架构设计如下所示:
整体的工程流程如下所示:
一、主工程在运行的时候,会去服务器获取最新的应用配置
二、主工程在获取配置后,将一一创建应用,并为应用绑定生命周期
三、当主应用监测到路由变化的时候,将寻找是否有对应的路由匹配规则
四、当匹配对应用的时候,则加载相应的应用
4、业务实践
构建主应用基座
将普通的项目改变成qiankun 主应用基座,需要进行三步操作:
l创建主应用容器,用于渲染子应用;
l注册子应用,设置子应用的激活条件,子应用的地址等等;
l启动qiankun。
1. 创建主应用容器
我们在主应用中创建子应用的承载容器,这个容器规定了子应用的显示区域。
第55行:主应用菜单,用于渲染菜单,并配置菜单路由,触发路由加载子应用;
第65行:子应用加载后,渲染到当前节点中。
2. 设置qiankun插件
3. 设置运行时子应用配置
12行:通过props传递主应用的数据或者方法给子应用
33行 :从上代码可以看出,我们重写了请求html。因为结合我们业务场景,我们部分子应用走了集团的安全验证,因此用户登录主应用后,需要携带我们安全验证的token,重写请求html就是携带token去验证。
注:考虑到业务需求扩展性,因此我们采用node搭建web站点,提供站点的sso,权限,路由,跨域等功能。
子应用接入
在HTML中申明entry入口:
291行:自己编写一个entry文件,作为入口文件,在entry里声明lifecycles。
编写entry文件:
umirc中配置:
5行:子应用的base,默认为packe.json中的name字段。
更改webpack配置:
此处不做过多介绍,接入方式与react常规项目接入类似。
父子应用通知
l主应用中配置运行时apps以props将数据传递,子应用通过相应生命周期拿到数据存进store;
lqiankun提供一个全局的GlobalState来共享数据。
公共插件共享
因为qiankun将子项目的外链script 标签,内容请求到之后会记录到一个全局变量中,下次在使用,它会先从全局变量取。所以只要子项目配置webpack的externals,并在index.html中使用外链script引入这些公共依赖,便可实现子项目的公共依赖的按需引入
部署方案
之前所有的子项目都在一个工程中,打包速度随着业务线的膨胀越来越慢,现在使子项目独立开发,独立部署,单个模块项目打包也会加快。如下图所示,子工程部署只需要把子工程打包,然后传到CDN上,并把配置信息更新,配置信息包含子工程的资源地址及配置。
lAurthur平台是58自研的部署工具,包含测试,线上,回滚等环境,将静态资源自动化的部署到CDN;
l配置信息上传到上文提到的node服务上,主应用从node服务拉取配置信息,实现自动更新子应用项目接入。
监控方案
引入信安自研的前端监控平台,对页面进行实时监控,能够及时的发现子工程等相关问题。
权限方案
主应用接入信安权限系统,分配到各个子项目中,避免子项目重复对接权限,重复开发,由主应用统一分配。
总结
如我们所愿,通过微前端方案实现了华生数据管理平台,目前已经接入多个项目并迁移了老系统进入平台,消除了工程膨胀问题,工程大小也变得可控,子工程打包速度加快,提高了开发体验,并能够单独开发、单独部署、单独上线,业务之间互不影响,效果图如下:
1. https://qiankun.umijs.org;
2. https://umi.org;
3. https://microfrontends.cn;
4. https://single-spa.js.org。
推荐阅读: