目前经过一系列调研,大体总结出主流微前端方案大体分为
本文主要介绍EMP落地,概念可以通过其他相关文章进行了解
目前业务中台在业务推进过程中遇到比较多的问题是
从开发初期我们约定了中台的统一框架:React & hook
+ React-dom
+ React-router-dom
+ Mobx
+ Typescript
,减少后期的额外框架消耗以及维护成本;
复用组件、工具库之间使用lerna + monorepo 方式下沉项目组件,通过npm方式安装到独立业务
从项目过程中遇到形形式式的包管理问题,以及代码重复打包,包信息更新不能及时等等问题
自组织模式:应用之间是平等的,不存在相互管理的模式。设计难度大,不方便实施,但是通用度高。
从目前主流开发模式下是很难完成 自组织模式的微前端落地,直到 Module Federation
的出现
Module Federation
的特性中我们挖掘出一套属于业务中台的设计模型
基站式微前端 | EMP 微前端 | |
---|---|---|
路由 | 注册机制+子项目自定义 | 项目自定义,无需注册 |
支持多框架 | 支持 | 约定React框架(减少冗余与维护成本) |
复用组件引用 | 沙箱方式 | 可共享状态组件方式 |
部署入口 | 基座 | 任何项目可以作为入口 |
Store 状态共享 | 需改造 | 无需改造、无需注册、直接调用 |
模块调用 | 部分需要进行改造 | 直接调用 |
配置中心 | 约定入口 | 无(独立入口或独立组件支持,无需配置) |
Typescript类型提示 | 无法判断 | 提供一站式类型判断闭环 |
项目重构 | 需要根据约定重构 | 修改引用即可 |
以 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} /> 复制代码
远程同步ts类型代码提示
EMP基站主要作用是组织和共享通用库,而非统一入口、统一配置
框架级基站(以框架/技术栈为基础,为子基站提供框架级别的布局,方法,组件)
优点:
在开发过程中会遇到公共库的不断迭代以及项目使用的兼容性问题
Module Federation
在webpack5 beta-17
后支持定义版本,不同入口可以应用可以定制自己的引用库版本如 React:16.13.1
,然后从基站库相应版本里调用相应的组件域名规范遵循 emp-antd-[业务名称]-[环境].[一级域名].com。遵循这个规范,通过域名就能知道当前技术栈以及业务类型。
从实战过程中已经可以满足目前业务中台的微前端需求,调用以及协同方面也得到更好的推进
Ken.Xu |
D.Ragon |
Abel |
Benny Shi |
Jiguli |