Webpack 模块联邦(Module Federation)

模块联邦(Module Federation) 是 Webpack 5 推出的一个革命性功能,它让 多个独立构建的项目可以共享代码或组件,甚至在运行时动态加载对方的模块。


传统问题:

在大型前端体系中,尤其是 微前端架构 场景:

  • 各子应用需要复用组件(比如导航栏、登录模块等)

  • 每个子应用独立部署、独立构建

  • 想要共享组件,但不能打包到每个项目里(否则体积大、更新麻烦)

模块联邦的解决方案:

  • 允许一个应用暴露出模块(exposes)

  • 另一个应用在运行时去加载这个模块(remotes)

  • 两边可以共享依赖(如 react、vue、lodash 等)

  • 实现真正的跨应用模块复用


模块联邦依靠 Webpack 内置的运行时机制:

  1. 暴露端(Host / Remote)

    • 使用 ModuleFederationPlugin 配置 exposes 把模块暴露出去;
  2. 消费端(Consumer)

    • 使用 remotes 指定远程模块来源;
  3. 运行时动态加载

    • 当消费端访问远程模块时,Webpack 会在运行时拉取远程 bundle 并注册模块;
  4. 共享依赖

    • 通过 shared 声明两端共用依赖,避免重复加载。

配置示例

主应用(Host)

javascript 复制代码
// webpack.config.js
new ModuleFederationPlugin({
  name: 'hostApp',
  remotes: {
    // 告诉主应用,从 http://localhost:3001/remoteEntry.js 加载 remoteApp 的模块
    remoteApp: 'remoteApp@http://localhost:3001/remoteEntry.js'
  },
  shared: {
    react: { singleton: true, requiredVersion: '^18.0.0' },
    'react-dom': { singleton: true }
  }
});

远程应用(Remote)

javascript 复制代码
new ModuleFederationPlugin({
  name: 'remoteApp',
  filename: 'remoteEntry.js', // 暴露清单文件
  exposes: {
    './Button': './src/components/Button' // 暴露组件
  },
  shared: {
    react: { singleton: true },
    'react-dom': { singleton: true }
  }
});

主应用中使用远程组件:

javascript 复制代码
import React from 'react';

// 动态加载远程模块
const RemoteButton = React.lazy(() => import('remoteApp/Button'));

export default function App() {
  return (
    <React.Suspense fallback="Loading...">
      <RemoteButton />
    </React.Suspense>
  );
}

配置项:

名称 含义
name 应用名称,暴露或引用时的标识
filename 构建输出的入口文件,用于远程加载
exposes 当前应用暴露出的模块
remotes 当前应用依赖的远程模块
shared 公共依赖,防止重复加载版本冲突

使用场景:

  1. 微前端架构

    • 多个独立子应用共享 UI 组件、工具库、公共逻辑。
  2. 团队协作开发

    • 团队 A、B 各自维护独立项目,但需要共享部分模块。
  3. 动态加载独立功能模块

    • 像插件系统,按需从服务器加载新模块。

常见问题:

  1. 版本冲突

    • 使用 shared 的 singleton 和 requiredVersion 控制依赖版本。
  2. 远程模块加载失败

    • 检查 remoteEntry.js 是否能被访问;

    • 跨域时配置 CORS。

  3. 类型支持(TS项目)

    • 可以通过 declare module 'remoteApp/Button' 声明类型。

对比微前端

对比项 模块联邦 微前端框架(如 qiankun)
目的 代码级模块共享 应用级独立运行
加载方式 Webpack 运行时加载 iframe / sandbox / 子路由等
适用场景 组件共享、跨项目复用 独立项目集成
构建关系 构建时/运行时共享 完全独立构建

实际项目中常常 模块联邦 + 微前端 一起使用。

相关推荐
claider10 分钟前
Vim User Manual 阅读笔记 User_03.txt move around
笔记·编辑器·vim
a程序小傲10 分钟前
得物Java面试被问:方法句柄(MethodHandle)与反射的性能对比和底层区别
java·开发语言·spring boot·后端·python·面试·职场和发展
IT_陈寒13 分钟前
Java并发编程实战:从入门到精通的5个关键技巧,让我薪资涨了40%
前端·人工智能·后端
全栈前端老曹13 分钟前
【包管理】read-pkg-up 快速上手教程 - 读取最近的 package.json 文件
前端·javascript·npm·node.js·json·nrm·package.json
saoys14 分钟前
Opencv 学习笔记:一文掌握四种经典图像滤波(均值 / 高斯 / 中值 / 双边)
笔记·opencv·学习
独自破碎E17 分钟前
比较版本号
java·开发语言
zimoyin24 分钟前
浅浅了解下0拷贝技术
java·linux·开发语言
AI架构师易筋28 分钟前
AIOps 告警归因中的提示工程:从能用到可上生产(4 阶梯)
开发语言·人工智能·llm·aiops·rag
水冗水孚34 分钟前
告别黑盒!手写Windows版简易NodeMON,学习文件监听代码修改与进程服务重启知识
node.js·express
你的冰西瓜36 分钟前
C++中的array容器详解
开发语言·c++·stl