WP5 模块联合:多次实例化单例

问题描述

不幸的是,我对此的重现是在一个复杂的专有项目中,所以我会尽力解释发生了什么。

最接近我的用例的示例项目是这个:https://github.com/module-federation/module-federation-examples/tree/master/dynamic-system-host 本质上,我有一个全向设置,其中单个 Shell 应用程序使用一组远程应用程序。远程应用程序是在运行时发现的,因此不会在 Webpack 配置中指定。

Shell 以及所有 Remotes 都依赖于共享库 my-shared-lib:

"dependencies": {
    "my-shared-lib": "^1.0.0"
}

Shell 在其 Webpack 配置中将此库公开为一个急切的单例:

new ModuleFederationPlugin({
  name: 'shell',filename: 'shellDeFinition.js',shared: {
      'my-shared-lib': { singleton: true,eager: true,requiredVersion: '^1.0.0' }
  },}),

遥控器,在他们的配置中,也有它作为共享,但并不急切:

new ModuleFederationPlugin({
  name: 'remoteNameHere',filename: 'remoteDeFinition.js',exposes: {
    './app': path.join(modulePath,'app.js'),},eager: false,})

问题是这样的:我已经通过运行时调试和检查 Webpack 生成的包验证了这个库被包含并实例化了几次——一次用于外壳,一次用于每个远程。 lib 的代码甚至存在于 Webpack 在获取暴露的 ./app.js 时加载的 Remote 的包中。

我不知道这里发生了什么。我也尝试共享 my-shared-lib 的每个依赖项,但这无济于事。

我的期望是 Remotes 使用由 Shell 共享的 my-shared-lib 实例,而不是创建自己的实例。

我是完全误解了依赖共享的工作原理,还是我做错了什么?

应该注意的是,Shell 和 Remots 都有一个入口点。

解决方法

对于您的远程 webpack 模块联合配置,尝试删除单例选项(在两个配置中都设置它可能是问题,您只需要一个应用程序来初始化单例)和急切选项(我认为默认情况下它是 false,这选项告诉在检查共享依赖项之前加载依赖项,因此您主要在容器应用程序上使用它)。这就是我在我的配置(多个遥控器)上所做的,它似乎运行良好:

new ModuleFederationPlugin({
  name: 'remoteNameHere',filename: 'remoteDefinition.js',exposes: {
    './app': path.join(modulePath,'app.js'),},shared: {
      'my-shared-lib': { requiredVersion: '^1.0.0' }
  },})

PS(我们永远不知道):在使用模块联合时,您可能会遇到 tree shacked 库的问题,它会在将它们放在共享上时下载所有整个库。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...