从一个需求开始慢慢了解 webpack 5 的Module Federation(模块联邦)

需求场景描述

在B端的多个业务系统中,模块A 存在于存在业务系统甲中,强依赖该业务系统;模块A的体积随着需求的不断更新迭代也在一天天变大,加载的速度也在一天一天的变慢。

加载慢的原因有多个方面,本身模块A的功能很大很复杂,大量组件,以及网络请求,以及强制的接口依赖顺序等等各方面原因;

项目的脚手架依旧使用的是 vue + element ,这熟悉的配方,熟悉的味道;但是因为是内网项目且对应的客户群体尤为特殊,我们自己封装了统一的业务系统脚手架以及魔改的它妈都认不出的Element UI,作为我们的业务统一的基座;

就在这样的项目情况下,项目乙 也需要集成 模块A, 而且整个的业务流程模块A在乙项目中作为前置流程,有了这个前置才能流转到项目甲;

是的没错,就这么扯,模块A既满足了项目乙的业务,还满足了系统甲的业务,然后构成了整个业务的闭环;

因为只是流程的不同和部分内容的不同(很多都是共用的),我们决定将业务进行耦合;决定不拆分。

最原始的解决方案

V1.0的方案也就是最原始的方案就是 模块A存在于项目甲中; 项目乙 使用 iframe 加载项目甲的页面组件(模块A); 通过参数 进行了 业务隔离; 顺利上线后,用肯定是用,跑的也很欢;客户因为是从CS的系统 首次过渡到BS的系统; 整体操作体验,界面UI,都优于CS,客户表示没啥问题;但是慢慢的就开始反馈页面打开非常慢7,8秒 loading 才能消失,严重影响工作效率,要求限时优化,实现秒开和其他页面响应时间一致。

那我们经过了分析是有优化的空间的;其实我们自己也知道很慢,但是没办法目前就只能这样;

那因为客户的特殊性 优化指定是必须要进行的;于是就有了第二版的方案;

第二版的解决方案

经过分析 也大致确定了优化的点无非就是,

  • 需加载,按需显示,
  • 能异步的API接口全部异步,同步的强依赖的接口尽可能的合并;
  • 页面的数据字典加载全部进行了业务分离,抽象成了全局的字典集合,以 provider 的形式下发;
  • 针对不需要响应式的数据进行了冻结;
  • 页面的拆分,再组织等等

经过了这一波的优化,效果提升还是比较明显,加载速度有了肉眼可见的变化;

但是依旧不能达到秒开的效果;

继续分析是因为 iframe 加载的 项目甲初始化加载就慢了,其实也很好理解 因为项目甲的初始加载这个过程本身项目乙是不需要的,它作为使用方只是要甲的一个页面;但是甲的页面必须是甲初始化完成才能呈现出来的;

那这个点是可以优化的,于是就有了第三版;

目前的解决方案

既然要去掉项目初始化的时间,我们就思考那就吧 模块A 以npm包的形式进行封装成独立的业务模块;在需要的集成的业务系统中进行安装使用;

经过了紧张的开发及测试,终于跑在了生产环境;加载速度又有了肉眼可见的提升;

经过了一段时间; 随之而来的问题也逐渐凸显出来了; 那就是没错 bug修改后,或者需求优化过后发版 就需要将全部依赖该包的业务系统全部升级进行发布; 因为垮部门,垮业务中心等原因已经多次出现了版本不一致的情况。

虽然这个问题依然可以通过 行为去规范解决,但依旧不是最优的方式;能自动的咱们尽量不手动;毕竟谁都有忘记的时候;

现准备优化的方案

有了几次漏发版的经历,一直在寻找解决方案中.....

呐,寻找到了 webpack 5.x 模块联邦 的这个解决方案;

看模块联邦解释: 模块联邦(Module Federation)最早是由Zack Jackson这位工程师提出的一种JavaScript架构,后来被他和其他几个工程师共同编写集成进了webpack5。 所以要使用 模块联邦 webpack 的版本至少的V5 及以上,

模块联邦的核心作用官网介绍的很明确,那就是: 在当前构建中动态地加载来自另一个bundle或者build的代码 简单的讲就是: 在当前应用中动态地加载来自另一个应用的代码

多个独立的构建可以组成一个应用程序,这些独立的构建之间不应该存在依赖关系,因此可以单独开发和部署它们。

这通常被称作微前端,但并不仅限于此。

虽然这个概念的动机,是用于微前端的,但是依然非常适合我们当前的需求场景;多业务系统的依赖,解决掉系统加载的消耗,直接加载页面(模块);

解决方案算是有了,下一步就是实践了,下一篇 我们从一个 Demo 亲手实践配置配置以进一步了解这个模块联邦;

毕竟实践出真知嘛,Demo 跑通了对其有一定的基本了解之后再开始集成进业务系统。

下一篇 《了解使用webpack Module Federation 就从这个Demo 开始》 我们将通过一个Demo 去基本的了解一下 Module Federation 。

最后的最后

下面请上我们今天的主角:有请小趴菜

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax