Webpack 5模块联邦

在微前端架构里,每个子应用独立开发、独立部署,却又要共享组件、避免重复打包。Webpack 5 的 Module Federation 把这一诉求变成了"一行配置 + 一次 HTTP 请求"就能完成的事。

一、为什么需要模块联邦

传统微前端方案常把公共库打包进每个子应用,导致:

  • 同一份 lodash 在 A、B、C 项目里出现三次
  • 子应用升级依赖需全量重新部署
  • 运行时版本冲突难以检测

Module Federation 把这些痛点抽象成 "远程模块" 概念:共享代码不再属于任何一方,而是成为按需拉取的独立产物。

二、核心思想

每个微前端都是一个 联邦(Federation),拥有:

  • name:全局唯一标识,如 homeactive
  • exposes:向外提供的模块列表
  • remotes:需要消费的远程联邦地址
  • shared:共享依赖,避免重复加载

联邦之间通过 HTTP 动态加载对方的入口文件,实现真正的运行时共享。

三、实战:两个独立工程的互相引用

场景

  • home 工程:提供实时时钟组件 now.js
  • active 工程:提供新闻列表组件 news.js
  • 两者都使用 jquery
  1. home 工程暴露 now
js 复制代码
// home/webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin')

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'home',
      filename: 'home-entry.js',
      exposes: { './now': './src/now.js' },
      shared: { jquery: { singleton: true } }
    })
  ]
}

访问 http://localhost:8080/home-entry.js 即可得到联邦入口。

  1. active 工程消费 now
js 复制代码
// active/webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin')

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'active',
      filename: 'active-entry.js',
      remotes: { home: 'home@http://localhost:8080/home-entry.js' },
      exposes: { './news': './src/news.js' },
      shared: { jquery: { singleton: true } }
    })
  ]
}

在代码中直接远程引入:

js 复制代码
import now from 'home/now'

Webpack 会在运行时去 8080 拉取 home-entry.js,并缓存解析结果。

  1. 共享依赖
    shared: { jquery: { singleton: true } } 声明 jquery 为单例:
  • 两个联邦共用一份运行时实例
  • 版本不一致时,Webpack 会抛出运行时警告,避免静默冲突

四、运行时流程揭秘

  1. 浏览器加载 active-entry.js
  2. 发现 home/now 依赖,异步请求 http://localhost:8080/home-entry.js
  3. home 联邦把 now.js 模块注入全局变量 home
  4. active 联邦通过 window.home.get('./now') 拿到模块引用
  5. 模块代码与依赖 jquery 一并执行,页面显示实时时钟

整个过程零打包冗余,零版本冲突,零额外脚本。

五、迁移与最佳实践

  • 渐进式改造:旧项目保持独立构建,只需新增联邦暴露与远程声明即可接入共享生态
  • 共享策略:将 UI 组件库、工具函数、通用业务模块放入联邦,主应用专注业务差异化
  • 版本管理:通过 requiredVersion 字段声明兼容范围,防止破坏性升级
  • CDN 加速:联邦入口文件与产物部署到 CDN,实现全球低延迟拉取

结语

模块联邦把微前端的"代码共享"从构建时难题转化为运行时协议:

  • 暴露方像发布 npm 包一样声明模块
  • 消费方像 import 本地文件一样引用模块
  • Webpack 负责版本协商、冲突检测与按需加载
相关推荐
云枫晖4 分钟前
JS核心知识-对象继承
前端·javascript
w重名了1098825 分钟前
记录一次gnvm切换node版本显示内存溢出的报错
前端·node.js
我是天龙_绍6 分钟前
经常写CSS难的复杂的就害怕,不用怕,谈 渐变 不色变
前端
用户2519162427117 分钟前
Node之EventEmitter
前端·javascript·node.js
鹏多多14 分钟前
flutter-详解控制组件显示的两种方式Offstage与Visibility
前端·flutter
用户72362373705814 分钟前
农业银行转账模拟器, 银行卡余额模拟器,jar最新逆向插件开源
前端
小岛前端17 分钟前
sass-embedded:高性能版的 Sass
前端·vue.js
甜瓜看代码24 分钟前
面试题---安卓
面试
天蓝色的鱼鱼29 分钟前
Vue Router 动态路由完全指南:灵活掌控前端路由
前端·vue.js
道可到29 分钟前
Java 面试通关笔记 01|拆箱与装箱:你真的理解了吗?
后端·面试