2022-09-24 21:19:20
模块联邦(Module Federation)是 Webpack 5 引入的一项功能,允许多个独立的 JavaScript 应用在运行时动态共享代码,实现微前端架构。
核心概念模块联邦允许一个应用在运行时动态加载另一个应用暴露的模块,从而将大型项目拆分为多个小型、独立部署的子应用。每个子应用可以自由使用其他应用中的组件、函数或状态管理逻辑,避免重复打包,提升加载效率和维护性。
工作原理模块联邦通过配置 Webpack 的 ModuleFederationPlugin 实现,主要涉及两个角色:
远程应用(Remote):暴露自己的模块供他人使用。在构建时,远程应用会生成一个入口文件(如 remoteEntry.js),宿主应用通过动态加载这个文件来获取可用模块的元信息,然后按需加载具体模块。
宿主应用(Host):消费远程应用暴露的模块。
基本配置示例假设有一个远程应用要暴露一个按钮组件:
new ModuleFederationPlugin({ name: 'remoteApp', filename: 'remoteEntry.js', exposes: { './Button': './src/components/Button', }, shared: { react: { singleton: true }, 'react-dom': { singleton: true } }})宿主应用则这样引入:
new ModuleFederationPlugin({ name: 'hostApp', remotes: { remoteApp: 'remoteApp@之后就可以在宿主中异步加载远程组件:
import Button from 'remoteApp/Button';优势与适用场景模块联邦特别适合需要长期维护、多团队协作的大型系统。其优势包括:
支持独立开发、测试和部署各个子应用。
减少构建耦合,提升编译速度。
实现运行时依赖共享,降低整体资源体积。
天然支持微前端架构,比如主应用集成多个业务模块。
常见的应用场景包括企业级中台系统、电商平台的不同频道整合、以及跨部门协作的复杂 SPA 项目。
注意事项模块联邦改变了我们对前端工程边界的理解,让真正意义上的模块化运行时集成成为现实。不复杂但容易忽略的是配置一致性和版本兼容问题,尤其是在共享库的处理上要格外小心。