本文主要是介绍基于下一代构建方案落地JOYY业务中台微前端,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
目前经过一系列调研,大体总结出主流微前端方案大体分为
- 基座模式:通过搭建基座、配置中心来管理子应用
- 统一框架约定方案 如《微前端在美团外卖的实践背景》
- 统一业务框架 REACT
- 统一配置信息
- 建立基座工程,用于管理子工程的路由切换、注册子工程的路由和全局Store层、提供全局库和复用层
- 问题点
- 通过中心化配置的方式注册到基座工程进行加载
- 项目改造存在一定成本
- 代码复用性以及子应用调用的易用性存在疑虑
- 多框架并存方案 如 Single-spa
- 多框架并存、并且实现互不干扰
- 创建根应用程序,以动态模块加载的方式加载子应用。
- 独立发布的子应用提供一个活动 url 资源地址,随后在根应用中借助模块加载器(如 SystemJS)动态加载。
- 问题点
- 对于React 深度定制项目来说,无法做到状态管理很好的传递
- 对于非标准的AMD、UMD、SystemJS 等加载方式的库会存在依赖问题(需要针对性改造)
- 多框架实现体积过大以及存在一定的调试成本
- 自组织模式:通过约定进行互调
- monorepo + npm包组合
- amd,cmd or umd 等直接引用
- webpack external
- 问题点
- 一个比较有意思对Module Federation分析的文章 《Webpack 新功能 Module Federation 深入解析》 ,可以解答大部分目前以 上自组织模式 遇到的问题
-
本文主要介绍EMP落地,概念可以通过其他相关文章进行了解
思考
目前业务中台在业务推进过程中遇到比较多的问题是
- 如何更好的减少代码冗余
- 如何更高效的提升开发效率
- 如何减少通用资源更新所带来的影响力度
- 项目与项目之间如何更好下沉业务组件
- 可复用库与组件之间如何形成约定类型或者文档,让调用方更加高效完成任务,减少沟通成本
统一技术栈
从开发初期我们约定了中台的统一框架:React & hook
+ React-dom
+ React-router-dom
+ Mobx
+ Typescript
,减少后期的额外框架消耗以及维护成本;
复用组件、工具库之间使用lerna + monorepo 方式下沉项目组件,通过npm方式安装到独立业务
从项目过程中遇到形形式式的包管理问题,以及代码重复打包,包信息更新不能及时等等问题
尝试使用 single-spa 落地微前端
- 项目推进中期上微前端需要对项目源码进行改造
- 项目深度依赖mobx 进行状态管理,依赖react-router-dom 做路由管理,在通用组件调用的同时不能用路由包裹传递(下面有具体用例说明)
- 依赖single-spa 对非 umd 调用库支持不足需要进行一定改造
自组织模式
自组织模式:应用之间是平等的,不存在相互管理的模式。设计难度大,不方便实施,但是通用度高。
从目前主流开发模式下是很难完成 自组织模式的微前端落地,直到 Module Federation
的出现
方案设计
从 Module Federation
的特性中我们挖掘出一套属于业务中台的设计模型
- 组件联邦机制方式代替中心化,无需基站以及配置中心介入
- 以ts类型的方式进行约定
- 统一React框架、让组件中可以深度定制与引用(无需更改原有业务代码)
- 建立完善脚手架和类型同步方案,让开发部署得到约束以及自动化完成
基站式微前端方案 VS EMP微前端方案
|
基站式微前端 |
EMP 微前端 |
路由 |
注册机制+子项目自定义 |
项目自定义,无需注册 |
支持多框架 |
支持 |
约定React框架(减少冗余与维护成本) |
复用组件引用 |
沙箱方式 |
可共享状态组件方式 |
部署入口 |
基座 |
任何项目可以作为入口 |
Store 状态共享 |
需改造 |
无需改造、无需注册、直接调用 |
模块调用 |
部分需要进行改造 |
直接调用 |
配置中心 |
约定入口 |
无(独立入口或独立组件支持,无需配置) |
Typescript类型提示 |
无法判断 |
提供一站式类型判断闭环 |
项目重构 |
需要根据约定重构 |
修改引用即可 |
EMP工作流
- @efox/emp-cli 脚手架主要作用是
- 调试
- 构建、代码分析
- 生成项目所需类型
- 通过远程项目类型
- @efox/emp-tune-dts-plugin ts相关类型操作
用例代码展示
以 antd
+ react-router-dom
为例通过远程方式引入外部定义好的骨架应用
//base->App.tsx
const App = ({layout, routes, stores}: RouterCompType) => (
<StoreProvider stores={stores}>
<RouterComp layout={layout} routes={routes || []} />
</StoreProvider>
)
复制代码
当前应用引入外部库
//app->bootstrap.tsx
import EMPApp from '@emp-antd/base/App'
import stores from 'src/stores'
const App = () => <EMPApp routes={routes} stores={stores} />
复制代码
通过远程同步类的方式进行代码提示
总结
从实战过程中已经可以满足目前业务中台的微前端需求,调用以及协同方面也得到更好的推进
- 1、从根本上摆脱了框架的束缚
- 2、在最轻量级的基础上进行微前端化,并且大量保留了原来代码的业务逻辑
- 3、最大化减少代码的冗余和更高的代码复用
- 4、落地应用不受入口限制,大大的提升了应用的定制如多主题等诉求
作者
Ken.Xu
这篇关于基于下一代构建方案落地JOYY业务中台微前端的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!