当前位置: 首页 > news >正文

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)

// 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)

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

主应用中使用远程组件:

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 / 子路由等
适用场景组件共享、跨项目复用独立项目集成
构建关系构建时/运行时共享完全独立构建

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

http://www.dtcms.com/a/470602.html

相关文章:

  • 河南锦源建设有限公司网站重庆建站网站建设平台
  • JZ39 数组中出现次数超过一半的数字
  • 网站开发智能化方向门户网站建设原则
  • 【React】动态SVG连接线实现:图片与按钮的可视化映射​
  • 专门做油站数据的网站游戏网页版入口
  • 【碎片化学习】SpringBoot数据库驱动介绍配置方法和代码
  • 设计模式篇之 适配器模式 Adapter
  • 小程序怎么制作自己的小程序seo长尾关键词优化
  • 网站备案号规则中核集团2023校园招聘信息
  • postman 做接口测试之学习笔记
  • 做网站要买多少服务器空间有什么做家纺的网站
  • 【编号26】青藏高原地理空间全套数据集(矢量边界、子流域、行政边界、水系等)
  • loguru 和 logging 的详细对比
  • 番禺移动网站建设百度快照投诉中心官网
  • 调试去符号化/strip 过的二进制的调试方法
  • 大连建设局网站地址怎么将自己房子投入网站做民宿
  • 新河网站旅游网站策划方案
  • 建网站备案好麻烦长春市建设工程造价管理协会网站
  • 东莞设计网站建设方案南京网站建设排名
  • Dirty COW容器逃逸漏洞渗透实战:原理+复现 (CVE-2016-5195)
  • 2010 866数据结构 算法设计题——链表,二叉树
  • 对海尔网站建设水平的评价长沙网站备案
  • Codeforces Round 1057 (Div. 2)(A-D)
  • 微信网站备案wordpress step2
  • XSS 漏洞全解析:从原理到实战
  • 傻瓜式 建网站软件外包公司人数
  • Nestjs service 对应token的作用范围
  • Google 智能体设计模式:评估与监控
  • 如何屏蔽网站ipwordpress 商城模板下载
  • OpenMM 8 安装与上手指南