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

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)

相关文章:

  • HTML 标签
  • [docker]镜像操作:关于docker pull、save、load一些疑惑解答
  • istio流量管理问题
  • day49python打卡
  • YoloV8改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
  • PHP使用经纬度获取两个位置的距离以及范围查询
  • 高斯列主元消去法——python实现
  • 九、MySQL执行原理
  • vue3 daterange正则踩坑
  • 大疆上云API demo前端代码理解
  • 词法分析器
  • 13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
  • 基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
  • 网站指纹识别
  • BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
  • 微波雷达水位在线监测装置:技术解析与应用价值
  • 淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
  • 通过ESP32开发板,实现NFC卡片控制继电器通断,从而实现多种物联网中设备的通电
  • 基于STM32物联网智能鱼缸智能家居系统
  • Java线上CPU飙高问题排查全指南
  • 太原建站模板源码/百度app打开
  • vs2017移动网站开发/苏州网站
  • 自己可以做防伪网站吗/百度seo插件
  • 哪个网站可有做投票搭建/百度seo是什么
  • 怎么做卖橘子的网站/公司网络推广网站
  • 郑州网站关键词推广/网络营销推广方案论文