前端面试题 - 57. Webpack 5的模块联邦

886 阅读5分钟

模块联邦

Webpack 5的模块联邦(Module Federation)是一项新功能,它可以让我们在不同的Webpack构建之间共享JavaScript模块。这意味着我们可以将一个Webpack构建中的模块暴露给另一个Webpack构建,并在另一个Webpack构建中使用该模块,而无需将该模块打包到另一个构建中。 具体来说,模块联邦可以让我们实现以下功能:

  • 在不同的Webpack构建之间共享代码,减少重复打包的代码,提高构建速度。
  • 在不同的Webpack构建之间共享状态,使得应用程序更容易进行横向扩展。
  • 在不同的Webpack构建之间共享React组件、Vue组件等,使得应用程序更容易进行微服务化。

下面是一个简单的例子,演示了如何在两个Webpack构建之间共享代码: 在构建A中,我们将lodash模块暴露给其他构建:

// 构建A
module.exports = {
  ...
  plugins: [
    new ModuleFederationPlugin({
      name: 'app_a',
      library: { type: 'var', name: 'app_a' },
      filename: 'remoteEntry.js',
      exposes: {
        './lodash': 'lodash',
      },
    }),
  ],
};

在构建B中,我们使用构建A中暴露的lodash模块:

// 构建B
module.exports = {
  ...
  plugins: [
    new ModuleFederationPlugin({
      name: 'app_b',
      library: { type: 'var', name: 'app_b' },
      filename: 'remoteEntry.js',
      remotes: {
        app_a: 'app_a',
      },
    }),
  ],
};

在构建B中,我们通过远程引入(remote import)的方式使用构建A中暴露的lodash模块:

import _ from 'app_a/lodash';

在上面的代码中,我们使用了远程引入的语法,请求了名为app_a的Webpack构建,并从该构建中获取了lodash模块。由于构建A中已经将lodash模块暴露出来了,因此我们可以在构建B中使用该模块,而无需将该模块打包到构建B中。 总之,Webpack 5的模块联邦是一项非常强大的功能,它可以让我们更轻松地共享代码、状态和组件,提高应用程序的可扩展性和可维护性。

实现原理

  1. 库的导出和导入

模块联邦通过Webpack的plugin机制,在Webpack构建过程中向模块中注入一些代码,使得我们可以将一个Webpack构建中的模块暴露给其他构建,或者从其他构建中引入模块。

  1. 远程引入和远程执行

在使用远程引入的方式引入模块时,Webpack会生成一个类似于JSONP的脚本标签,并通过该标签请求远程构建的代码,并将其注入到当前构建中。在远程构建的代码加载完成后,Webpack会执行该代码,并执行其中的导入语句,从而将远程构建中的模块导入到当前构建中。

  1. 全局变量的使用

在将模块暴露给其他构建时,我们需要将该模块挂载到全局变量上,以便其他构建可以通过该全局变量访问该模块。在引入其他构建的模块时,我们也需要使用全局变量来访问该模块。

  1. 代码的解析和转换

在实现模块联邦的过程中,Webpack需要解析和转换模块的代码,以便将模块的导出和导入转换为可执行的代码,并且将模块的依赖关系解析出来。在远程引入模块时,Webpack还需要解析该模块的远程地址,并生成请求该地址的代码。 总之,模块联邦的实现原理主要涉及到模块的导入和导出、远程引入和远程执行、全局变量的使用以及代码的解析和转换等方面,其中Webpack的plugin机制起到了重要的作用。

应用场景:

  1. 微服务架构

模块联邦可以使得应用程序更容易进行微服务化,不同的Webpack构建可以分别承担不同的业务模块,通过模块联邦共享代码和组件,从而实现应用程序的横向扩展和快速迭代。

  1. 多页面应用

在多页面应用中,不同的页面可能需要共享某些公共的代码或组件,使用模块联邦可以将这些公共的代码或组件打包成一个公共的Webpack构建,并在各个页面中引入,从而减少重复的打包和加载,提高应用程序的性能。

  1. 多个子应用共享代码

在一个大型的应用程序中,可能有多个子应用,这些子应用可能需要共享某些公共的代码或组件,使用模块联邦可以将这些公共的代码或组件打包成一个公共的Webpack构建,并在各个子应用中引入,从而减少重复的打包和加载,提高应用程序的性能。

  1. 第三方组件库

在开发第三方组件库时,我们可以使用模块联邦将组件库的代码打包成一个Webpack构建,并暴露出一些接口,供其他应用程序使用。其他应用程序可以通过远程引入的方式使用该组件库,从而实现代码的复用和解耦。

总之,模块联邦是一项非常强大的功能,它可以让我们更轻松地共享代码、状态和组件,提高应用程序的可扩展性和可维护性,适用于各种不同的应用场景。

参考:cloud.tencent.com/developer/a…