HTML5教程

基于下一代构建方案落地JOYY业务中台微前端

本文主要是介绍基于下一代构建方案落地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业务中台微前端的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!