模块联邦是webpack 5实现微前端的核心技术,支持运行时跨应用共享模块,通过exposes暴露、remotes引入、shared单例共享依赖,兼顾隔离与复用。

模块化在微前端中不是简单地用 import/export 就能解决的。它需要在“隔离”和“共享”之间做精细平衡:既要防止子应用互相污染,又要让必要的能力(如组件、工具函数、状态)可被安全复用。核心不在语法层面,而在运行时机制设计。
JS 与 CSS 隔离是模块共享的前提
没有隔离,共享就等于裸奔。两个子应用若都改了 window.utils 或定义了 .btn 样式,直接冲突。
- JS 隔离靠沙箱:主流方案是代理沙箱(Proxy-based Sandbox),比快照沙箱更精准——它不记录全部 window 属性,而是拦截对全局对象的读写操作,在子应用激活时创建一个代理层,所有修改仅作用于该代理视图;卸载时自动失效,不残留副作用。
-
CSS 隔离靠作用域:不依赖 iframe 的强隔离,而是用 CSS Modules、CSS-in-JS 或构建时自动添加唯一属性选择器(如
[data-app-id="user"] .btn)来限定样式生效范围。模块联邦本身不处理 CSS,需配合构建工具或运行时注入策略。
模块联邦(Module Federation)实现按需共享
它让子应用像调用本地模块一样使用远程模块,但背后是运行时动态加载 + 依赖协调,不是编译期合并。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Remote 端暴露模块:在子应用 Webpack 配置中通过
exposes明确导出路径,比如./Button指向具体组件文件;同时用shared声明 React、lodash 等基础依赖,设置singleton: true确保整个页面只有一份实例,避免 hooks 失效或事件监听错乱。 -
Host 端声明远程源:主应用配置
remotes,指向子应用发布的remoteEntry.js地址;之后就能直接import Button from "userApp/Button",Webpack 会在运行时自动下载并执行对应 chunk。 -
不共享 ≠ 不可用:未被
shared的依赖仍会各自打包,但模块联邦会智能复用已加载的 shared 模块,避免重复初始化——比如子应用 A 加载了 React 18,子应用 B 再 import 时不会重新执行 React 入口,而是复用已有实例。
跨应用通信与状态协同不能靠模块直连
模块联邦共享的是静态模块(组件、函数),不是运行时状态。子应用之间要同步登录态、刷新购物车,得另建通信通道。
-
轻量通信用 CustomEvent:主应用统一维护一个
EventBus,封装emit/on方法,子应用通过命名空间(如auth:login、cart:update)发布/订阅,避免全局事件名冲突。 -
状态同步靠代理层:把共享状态挂到
window.__MICRO_STATE__,再用 Proxy 包裹,拦截 set 操作并广播变更;各子应用通过getState('user')和setState('user', data)访问,不直接操作原始对象。 - 避免反模式:不要让子应用直接 import 另一个子应用的 store 实例或 context,这会造成隐式耦合和生命周期错位;模块联邦不负责状态生命周期管理。
替代方案对比:什么时候不该用模块联邦
它适合中后台系统里多个 React/Vue 应用共享 UI 组件和基础能力,但不是万能解。
- 纯静态资源或强隔离场景选 iframe:比如嵌入第三方报表、支付页,不需要通信,只要样式 JS 彻底隔离,iframe 是最简单可靠的方案。
- 多技术栈混合且需统一生命周期用 single-spa:当子应用有 Angular、Vue2、React16 等老版本共存,模块联邦因 Webpack 5 限制无法覆盖,single-spa 提供标准生命周期钩子,更适合底层协调。
- 小团队快速验证可用 Git Submodule:不涉及部署链路改造时,用 submodule 管理公共工具库,开发阶段本地联动调试方便,只是上线后仍需各自打包,不适合高频迭代的共享逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










