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

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

        以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下:

前言

Module Federation 的Webpack.config.js核心配置包括:

  1. name + filename(定义应用标识)

  2. remotes(引用远程模块)

  3. exposes(暴露本地模块)

  4. shared(共享依赖,优化加载)

 Host应用中:

// host/webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { ModuleFederationPlugin } = require('webpack').container;
const webpack = require('webpack');module.exports = {// 📦 模式:development(开发)或 production(生产)mode: 'development',// 📂 构建入口:Webpack 构建从这里开始entry: './src/index.js',// 📤 构建输出output: {// 构建目录(dist 文件夹)path: path.resolve(__dirname, 'dist'),// 输出 JS 文件名(可以使用哈希做缓存)filename: '[name].[contenthash].js',// 所有静态资源的基础路径,必须指向 devServer 地址(用于加载 remote)publicPath: 'http://localhost:3000/',// 每次构建自动清空 dist 文件夹clean: true,},// 🌐 Dev Server 本地开发服务器配置devServer: {port: 3000, // 主机端口static: {directory: path.join(__dirname, 'dist'), // 静态资源路径},compress: true, // 启用 gzip 压缩hot: true, // 启用模块热替换historyApiFallback: true, // SPA 路由兼容open: true, // 启动时自动打开浏览器client: {overlay: true, // 编译错误以浮层形式显示},},// 📚 Source Map(方便调试)devtool: 'eval-source-map',// 📦 模块加载规则module: {rules: [{test: /\.js$/, // 匹配 JS 文件exclude: /node_modules/,use: 'babel-loader', // 使用 Babel 编译},{test: /\.css$/, // 匹配 CSS 文件use: ['style-loader', 'css-loader'], // 加载样式},{test: /\.(png|jpg|gif|svg)$/, // 图片加载type: 'asset/resource', // 转成文件资源},],},// 🔧 模块解析配置resolve: {extensions: ['.js', '.jsx', '.json'], // 自动补全扩展名alias: {'@': path.resolve(__dirname, 'src'), // 设置路径别名},modules: [path.resolve(__dirname, 'src'), 'node_modules'], // 优先搜索路径},// 🎯 性能提示控制performance: {hints: false, // 不提示 bundle 过大},// ⚙️ 缓存配置cache: {type: 'filesystem', // 文件系统缓存(构建更快)},// 💡 Webpack 插件plugins: [// 自动生成 HTML 页面,并注入输出的 JS 脚本new HtmlWebpackPlugin({template: './public/index.html',favicon: './public/favicon.ico',}),// 允许定义全局变量(编译时替换)new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),}),// 🌐 模块联邦核心插件new ModuleFederationPlugin({// 当前应用唯一标识name: 'host',// 使用远程模块的声明remotes: {remote1: 'remote1@http://localhost:3001/remoteEntry.js',remote2: 'remote2@http://localhost:3002/remoteEntry.js',},// 如果你要暴露本地组件(可选)exposes: {'./LocalComponent': './src/components/LocalComponent.js',},// 共享模块(版本控制、避免重复加载)shared: {react: {// 必须的库名称requiredVersion: '^17.0.0',// 是否单例模式(防止重复加载)singleton: true,// 是否立即加载(false为异步)eager: true,// 允许的版本范围version: '17.0.2',// 严格版本检查strictVersion: false,// 共享作用域名称shareScope: 'default'}},}),],// 🧠 优化配置(可选)optimization: {// 代码分割:把 node_modules 拆出来splitChunks: {chunks: 'all', // 所有模块分割},runtimeChunk: 'single', // 单独抽出运行时代码moduleIds: 'deterministic', // 稳定 moduleId,有利于长期缓存},// 🌍 目标环境(默认是 web)target: 'web',
};

Remote 应用的配置:

new ModuleFederationPlugin({name: 'remote1',filename: 'remoteEntry.js', //定义远程入口文件的名称,默认值: remoteEntry.jslibrary: { type: 'var', name: 'app1' },  //定义如何暴露模块exposes: {'./Button': './src/components/Button.js',},shared: {lodash: {singleton: true,import: 'lodash', // 精确指定导入包名eager: true, // 提前加载,避免延迟加载风险},react: { singleton: true, requiredVersion: '^18.2.0' },},
});

跟host应用的稍微差别,主要体现在下面两个属性:

  • filename(字符串)

    • 定义远程入口文件的名称

    • 默认值: remoteEntry.js

    • 示例: filename:remoteEntry.js 

    • 注意区分这个属性与下面表格中的output.filename,output.filename的全称是module.output.filename,但是这个属性的全称是module.filename

  • library (对象)

    • 定义如何暴露模块

    • 常用配置:

      library: {type: 'var',name: 'app1'
      }
    • type:暴露类型,可选值有varmoduleassignthiswindowselfglobalcommonjscommonjs2amdamd-requireumdumd2jsonp

    • name:暴露的全局变量名

总结表:

  • 常用属性总结:
模块属性含义
entry./src/index.js应用入口文件
output.pathdist构建输出目录
output.filenamebundle.js输出文件名
output.publicPathCDN 或本地路径用于动态加载 remote
devServer.port3000本地开发端口
module.rulesbabel-loader, css-loader, asset加载规则
pluginsHtmlWebpackPlugin, ModuleFederationPlugin插件系统
ModuleFederationPlugin.name'host'当前模块名
ModuleFederationPlugin.remotes远程模块映射remote 应用位置
ModuleFederationPlugin.exposes本地暴露模块可供 remote 使用
ModuleFederationPlugin.shared共享模块避免重复打包
optimization.splitChunks公共依赖提取减少重复代码
resolve.alias路径别名简化导入
cache.type'filesystem'启用构建缓存
performance.hints'false'忽略性能提示
  • 共享模块属性总结:
属性名类型说明
singletonboolean是否只加载一份模块(如 React 必须 true
strictVersionboolean是否强制匹配 requiredVersion,严格匹配版本
requiredVersionstring版本约束,所期望的依赖版本号(SemVer),要求的版本范围
versionstring实际运行时模块的版本(建议提供)
eagerboolean是否在启动时立即加载,默认懒加载(默认 false,建议 false)
import`stringfalse`
includeSecondariesboolean是否包含子模块(如 react/jsx-runtime)
shareScopestring指定共享作用域(默认为 default)
http://www.xdnf.cn/news/12916.html

相关文章:

  • Linux系统部署KES
  • 中国高等职业教育(专科)专业划分
  • C# 求圆面积的程序(Program to find area of a circle)
  • 探索Selenium:自动化测试的神奇钥匙
  • 牛客round95D
  • 20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
  • Electron 防脱壳转二进制 JSC 打包过程以及踩坑记录
  • 103页战略设计的核心:麦肯锡思维框架、分析方法与实施路径
  • AI会取代IT从业者吗?
  • 【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
  • C语言变量存储与指针:基础篇
  • 【HTML-16】深入理解HTML中的块元素与行内元素
  • Coze工作流-语音故事创作-文本转语音的应用
  • Ansible+Zabbix-agent2快速实现对多主机监控
  • 13.Websocket
  • WebRTC(一):整体架构
  • 【STM32】G030单片机开启超过8个ADC通道的方法
  • mongodb源码分析session执行handleRequest命令find过程
  • [ linux-系统 ] 进程控制
  • UNECE R79——解读自动驾驶相关标准法规
  • C++中vector类型的介绍和使用
  • 生成对抗网络(GAN)损失函数解读
  • 使用MFC中的CEvent实现两个线程之间的交替打印
  • 【Linux系统】Linux环境变量:系统配置的隐形指挥官
  • Gemini 2.5 Pro (0605版本) 深度测评与体验指南
  • MySQL 8.0 OCP 英文题库解析(十二)
  • Rust 学习笔记:共享状态并发
  • 三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
  • 从零手写Java版本的LSM Tree (三):MemTable 内存表
  • 图表类系列各种样式PPT模版分享