首页/文章/webpack

浅谈 Webpack5 之模块联邦

2024-07-10
8643 分钟
...

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

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

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

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

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

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

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

主容器与远程容器

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

动态加载

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

假设场景

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

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

创建主容器应用(Host)

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

npm install webpack webpack-cli html-webpack-plugin --save-dev

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

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


module.exports = {
  output: {
    publicPath: 'http://localhost:3002/', 
    uniqueName: 'app2', 
  },
  plugins: [
    new webpack.container.ModuleFederationPlugin({
      name: 'app2',
      filename: 'remoteEntry.js',
      exposes: {
        './CoolButton': './src/components/CoolButton', 
      },
    }),
  ],
};

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

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


module.exports = {
  plugins: [
    new webpack.container.ModuleFederationPlugin({
      name: 'app1',
      remotes: {
        app2: 'app2@http://localhost:3002/remoteEntry.js', 
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};

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


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 中文文档

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
webpack2025-03-05
webpack构建流程、基础配置、打包性能优化、热更新、和Vite区别
一、webpack构建流程 四个阶段: 初始化阶段 :读取配置文件、创建complier实例 编译阶段 :解析入口点、模块加载(loader) 打包阶段 :模块合并与优化、代码分割 输出阶段 :生成输出文件 1.配置文件解析: Webpack读取并解析webpack.config.js文件,获取构建所需的配置信息。 2.入口处理: Webpack从入口文件开始,构建模块依赖图。 3.模块加载与转换: 使用加载器处理不同类型的模块,如CS...
学习面试
webpack2025-03-04
深入解析 Webpack 的构建流程
1\. 初始化阶段:准备启动引擎 当你启动 时,它就像一个超级工厂的启动按钮,开始准备好一切——加载配置文件、初始化插件,并准备好开始生产。 实例:准备你的工厂配置 解释: 入口文件(Entry) :Webpack 从这里开始它的构建任务,像一个工厂的生产线入口。 输出路径(Output) :Webpack 会把构建好的产品放在这里。 就是每个产品的唯一标识,确保浏览器不会缓存过时的文件。 模块加载(Loaders) :当 Webpac...
学习面试
webpack2024-12-24
为什么组件库打包用 Rollup 而不是 Webpack
Rolup 是一个打包工具,类似 Webpack。 组件库打包基本都是用 Rollup。 那 Webpack 和 Rollup 有什么区别呢?为什么组件库打包都用 Rollup 呢? 我们来试一下: 我们创建两个模块: src/index.js src/utils.js 很简单的两个模块,我们分别用 rollup 和 webpack 来打包下: 安装 rollup: 创建 rollup.config.js 配置入口模块,打包产物的位置、...
学习
webpack2024-09-09
一起学习 Webpack 模块热替换
何为 HMR? 模块热替换(HMR Hot Module Replacement)功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面 当我们对代码进行修改并保存后,webpack 将对代码重新打包,并将改动的模块发送到浏览器,浏览器通过新的模块替换老的模块,从而实现局部更新且不需要刷新页面 为何需要 HMR? 在 HMR 出现之后,程序的加载都是页面级别的,即使是单个文件的发生改变,都需要刷新整个页面才能够获得最新的...
学习
webpack2024-04-07
Webpack 和 Rollup:您应该知道的一些事情
本文只做 Webpack 和 Rollup 的对比总结,不参入 esbuild、Vite 或其他工具的讨论 Webpack 和 Rollup 都是现在前端领域比较流行的打包工具,它们的相似之处在于可以帮助我们 把多个 JavaScript 文件打包成一个可以在浏览器中加载并在生产中使用的文件。 &nbsp; &nbsp; 打包成单个文件的好处是可以减少网络请求、提高网站性能等目的。 这篇文章主要想通过对比的方式讲讲这两种打包工具的差异...
学习面试
AI2026-09-01
Deep Agents 01:何为 Agent Harness,以及如何开始
1、本篇任务:完成一份多步骤、带证据的技术调研 普通客服 Agent 的问题短、工具少、输出即时。技术调研或编码任务会持续很久,产生计划、搜索结果、文件和中间结论。Deep Agents 在 LangChain/LangGraph 之上预装规划、虚拟文件系统、上下文压缩和子 Agent,适合这类开放任务。 本课让 Agent 比较两种向量数据库,并交付一份可验证报告。 2、什么时候需要 Deep Agent 满足以下两项以上再考虑:任务...
学习

评论

请登录后发表评论

去登录
加载评论中...