浅谈 Webpack5 模块联邦

概念

Webpack 模块联邦是一种先进的代码共享技术,它允许在多个独立构建的 Web 应用程序之间共享代码,而无需将这些代码提前发布到 npm 仓库或其他中央存储。

这项技术特别适用于微前端架构,因为它能让各个前端团队独立开发、部署自己的应用,同时还能无缝共享组件、库或功能模块。

通俗点说就是在微前端架构中每个应用都是独立的,独立开发,独立部署,在开发过程中避免不了有些模块是重复使用的,如何把这些重复的模块利用起来,一般情况下会通过 npm 进行安装或者相关代码重复编写,这样做不好的地方就是代码冗余,因为是微前端,会出现很多重复的内容,重复进行编写,开发效率降低,而模块联邦就很好的解决了这些问题。

好处

**动态加载:**模块可以在运行时动态加载,仅在需要时加载相关功能模块,减少初始加载体积,加速页面加载。

代码重用:可以共享通用的库和组件,避免重复代码,优化代码复用率。

**版本管理:**各个模块可以独立升级和版本化,不会因某个模块的更新影响整个应用。

**性能优化:**共享库避免重复包含,打包体积更小,网络传输更快,提高应用性能。

关键概念

主容器与远程容器

  • 主容器(Host):负责加载其他应用模块的应用,消费模块的容器。
  • 远程容器(Remote):提供模块供其他应用加载的应用,提供模块的容器。

动态加载

模块联邦允许应用在运行时动态加载其他应用的模块,而不是在构建时静态合并。这使得各个应用可以独立构建和部署,运行时按需加载所需的模块。

举例说明一下

假设场景

我们有两个独立的项目:app1app2

app1 想要复用 app2 中的一个名为 CoolButton 的组件。

创建主容器应用(Host)

首先,安装 Webpack 5 和相关插件:

javascript 复制代码
npm install webpack webpack-cli html-webpack-plugin --save-dev

设置 app2 作为共享模块的提供者(远程容器)

首先,在 app2webpack.config.js 文件中,我们需要配置 app2 以共享 CoolButton 组件。

javascript 复制代码
// app2/webpack.config.js
module.exports = {
  output: {
    publicPath: 'http://localhost:3002/', // 公共路径,确保在不同域下也能正确加载
    uniqueName: 'app2', // 确保在联邦中的唯一命名
  },
  plugins: [
    new webpack.container.ModuleFederationPlugin({
      name: 'app2',
      filename: 'remoteEntry.js',
      exposes: {
        './CoolButton': './src/components/CoolButton', // 共享 CoolButton 组件
      },
    }),
  ],
};

app1 中消费 app2 提供的 CoolButton 组件(主容器)

接下来,在 app1 中,我们需要配置 app1 以消费来自 app2CoolButton

javascript 复制代码
// app1/webpack.config.js
module.exports = {
  plugins: [
    new webpack.container.ModuleFederationPlugin({
      name: 'app1',
      remotes: {
        app2: 'app2@http://localhost:3002/remoteEntry.js', // 指定app2的远程入口
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};

然后,在 app1 的代码中,我们可以像导入本地模块一样导入 app2CoolButton

javascript 复制代码
// app1/src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import CoolButton from 'app2/CoolButton';

ReactDOM.render(
  <React.StrictMode>
    <div>
      <h1>Welcome to App1</h1>
      <CoolButton label="Click me!" />
    </div>
  </React.StrictMode>,
  document.getElementById('root')
);

总结

以上对模块联邦进行简单的介绍,当然实际使用当中还要根据各自的项目进行配置,大家可以查看官方文档进行更深一步了解Webpack 5 发布 (2020-10-10) | webpack 中文文档

相关推荐
万少2 小时前
HarmonyOS官方模板集成创新活动-流蓝卡片
前端·harmonyos
-To be number.wan4 小时前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
噢,我明白了4 小时前
JavaScript 中处理时间格式的核心方式
前端·javascript
纸上的彩虹5 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
be or not to be6 小时前
深入理解 CSS 浮动布局(float)
前端·css
LYFlied6 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
老华带你飞6 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小徐_23336 小时前
2025 前端开源三年,npm 发包卡我半天
前端·npm·github
GIS之路7 小时前
GIS 数据转换:使用 GDAL 将 Shp 转换为 GeoJSON 数据
前端
JIngJaneIL7 小时前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端