我们正在使用模块联合来创建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:加载脚本失败。
1条答案
按热度按时间jq6vz3qz1#
如果您启动了第二个应用程序,其名称为app2,并且remoteEntry对应于app2的版本,那么您将只公开名称为app2的应用程序及其remoteEntry。
如果您还需要一个app3来公开或访问它,则需要启动一个在ModuleFederationPlugin中配置了app3的应用程序。
一个可能的解决方案是分别进行两个构建,然后在插件中添加这样的内容:
这将允许您同时使用两个remoteEncyclopedia,但需要注意以下几点:
让我知道你是否已经解决了这个问题,或者如果这对你有用,用你自己的方式修改代码。