模块联邦通过运行时依赖协调机制避免重复加载,核心是共享同一份依赖实例:构建时不打包shared依赖,运行时通过shareScope复用已加载的React等库,并依赖singleton、requiredVersion等配置确保单例与版本兼容。

模块联邦通过运行时依赖协调机制,直接解决资源打包重复问题,核心不是“减少打包”,而是“避免重复加载”——让多个应用共用同一份依赖实例。
共享依赖如何避免重复打包
传统微前端中,每个子应用各自打包 React、Lodash 等库,导致最终产物里存在多份相同代码。模块联邦改用“运行时协商+全局作用域注册”的方式:
- Webpack 构建时不再将 shared 依赖打入每个子应用的 bundle,而是标记为“外部可共享”
- 运行时 Host 加载 remoteEntry.js 后,会检查全局共享作用域(shareScope)中是否已有该依赖
- 若已存在(比如 React 已由 Host 提前加载),则直接复用;否则才从远程加载
- 所有参与方配置一致的 shared 规则,就能确保整个页面只有一份 React 实例
关键配置决定优化效果
shared 字段不是简单罗列包名,需明确策略才能真正生效:
- singleton: true —— 强制单例,防止 React 多次初始化导致 Context 失效或 Hook 报错
- requiredVersion —— 指定语义化版本范围(如 "^18.2.0"),确保 Host 和 Remote 使用兼容版本
- eager: true —— 对 React、ReactDOM 等基础依赖预加载,避免运行时异步等待
- import: false(vite-plugin-federation)—— 不自动引入,交由业务代码按需 import,更精细控制加载时机
实际体积优化表现
实测数据表明,合理配置 shared 后:
- 子应用 vendor chunk 可缩小 55%~70%,尤其在使用 Ant Design、MUI 等大型 UI 库时更明显
- 首屏 JS 总体积下降约 40%,LCP 时间平均提升 57%
- HTTP 请求数减少,因多个应用共用同一份 CDN 上的 react@18.2.0.min.js
注意事项:不是所有依赖都适合共享
以下情况需谨慎处理:
- 状态类库(如 Redux Toolkit)若未统一 store 实例,共享后可能引发状态污染
- 带副作用的工具库(如 dayjs 插件、axios 拦截器)需确保初始化逻辑全局唯一
- 自定义 hook 或 Context Provider 必须随组件一同暴露,不能仅共享依赖本身


















