使用webpack模块联合发布同一应用程序的2个版本

ztmd8pv5  于 2023-10-19  发布在  Webpack
关注(0)|答案(1)|浏览(146)

我们正在使用模块联合来创建Web应用程序。我们面临着加载同一应用程序的不同版本的问题。
我们正在使用Promise动态远程加载同一应用程序的不同版本。https://webpack.js.org/concepts/module-federation/#promise-based-dynamic-remotes
下面是我们当前的主应用程序的webpack配置

const HtmlWebpackPlugin = require('html-webpack-plugin');
const { ModuleFederationPlugin } = require('webpack').container;
const ExternalTemplateRemotesPlugin = require('external-remotes-plugin');
const path = require('path');
const packageJsonDeps = require('./package.json').dependencies;
module.exports = {
  entry: './src/index',
  mode: 'development',
  devServer: {
    static: path.join(__dirname, 'dist'),
    port: 3001,
  },
  output: {
    publicPath: 'auto',
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        options: {
          presets: ['@babel/preset-react'],
        },
      },
    ],
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'app1',
      remotes: {
        app2: 'app2@[app2Url]/remoteEntry.js',
        app3: 'app3@[app3Url]/remoteEntry.js',
      },
      shared: {
        react: {
          singleton: true,
          eager: true,
          requiredVersion: packageJsonDeps['react'],
        },
        'react-dom': {
          singleton: true,
          eager: true,
          requiredVersion: packageJsonDeps['react'],
        },
      },
    }),
    new ExternalTemplateRemotesPlugin(),
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};

在这种情况下,app 2Url和app 3Url指向同一应用程序的不同版本。
下面是提供程序应用程序的webpack配置。

const HtmlWebpackPlugin = require('html-webpack-plugin');
const { ModuleFederationPlugin } = require('webpack').container;
const path = require('path');
const packageJsonDeps = require('./package.json').dependencies;

module.exports = {
  entry: './src/index',
  mode: 'development',
  devServer: {
    static: path.join(__dirname, 'dist'),
    port: 3003,
  },
  output: {
    publicPath: 'auto',
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        options: {
          presets: ['@babel/preset-react'],
        },
      },
    ],
  },
  plugins: [
    // To learn more about the usage of this plugin, please visit https://webpack.js.org/plugins/module-federation-plugin/
    new ModuleFederationPlugin({
      name: 'app2',
      filename: 'remoteEntry.js',
      exposes: {
        './App': './src/App',
      },
      shared: {
        react: {
          singleton: true,
          eager: true,
          requiredVersion: packageJsonDeps['react'],
        },
        'react-dom': {
          singleton: true,
          eager: true,
          requiredVersion: packageJsonDeps['react'],
        },
      },
    }),
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};

用例:-我们正在做实验性的角色的功能,由于我们要发布2个不同版本的远程输入,并使用我们的实验工具,我们将启用功能的少数用户。
我们得到下面的错误,而加载同一应用程序的不同版本
加载脚本失败。(missing:http://localhost:3003/remoteEntry.js)while loading“./App”from webpack/container/reference/app3 ScriptExternalLoadError:加载脚本失败。

jq6vz3qz

jq6vz3qz1#

如果您启动了第二个应用程序,其名称为app2,并且remoteEntry对应于app2的版本,那么您将只公开名称为app2的应用程序及其remoteEntry。
如果您还需要一个app3来公开或访问它,则需要启动一个在ModuleFederationPlugin中配置了app3的应用程序。
一个可能的解决方案是分别进行两个构建,然后在插件中添加这样的内容:

plugins: [
new ModuleFederationPlugin({
  name: 'app2',
  filename: '[app2Url]/remoteEntry.js',
  exposes: {
    './App': './src/App',
  },
  shared: {
    react: {
      singleton: true,
      eager: true,
      requiredVersion: packageJsonDeps['react'],
    },
    'react-dom': {
      singleton: true,
      eager: true,
      requiredVersion: packageJsonDeps['react'],
    },
  },
}),
new ModuleFederationPlugin({
  name: 'app3',
  filename: '[app3Url]/remoteEntry.js',
  exposes: {
    './App': './src/App',
  },
  shared: {
    react: {
      singleton: true,
      eager: true,
      requiredVersion: packageJsonDeps['react'],
    },
    'react-dom': {
      singleton: true,
      eager: true,
      requiredVersion: packageJsonDeps['react'],
    },
  },
}),
new HtmlWebpackPlugin({
  template: './public/index.html',
}),
]

这将允许您同时使用两个remoteEncyclopedia,但需要注意以下几点:

  • 是看到了两个不同版本的变化,还是仍然只得到主版本?
  • 这些代码适用于项目运行,对于构建,您必须为每个版本的app2和app3单独执行它们。

让我知道你是否已经解决了这个问题,或者如果这对你有用,用你自己的方式修改代码。

相关问题