6

我正在关注本教程,并尝试在 shell 和 mfe1 应用程序之间共享一个库。我在工作空间目录外创建了一个在 root 中注入的服务的 lib,然后将其添加到教程 package.json,并将其导入 shell 和 mfe1。在两个项目的 webpack 配置中,我添加了以下配置

new ModuleFederationPlugin({
      .....
        },        
        shared: {
          .....
          "my-lib": { singleton: true, strictVersion: true, requiredVersion: '1.0.0'},
          ...sharedMappings.getDescriptors()
        }
        
    }),

在测试 shell 时,我注意到单例服务被启动了两次,第一次是在加载 shell 时,第二次是在移动到 mfe1 时,也许我遗漏了一些东西,但 singleton: true配置的目的不是确保该服务只有一个实例存在?

4

1 回答 1

5

使用联合模块插件,当共享库上的单例属性设置为 true 时,这意味着即使多个 mfe 需要该库,该库也只会加载一次。如果您的 mfe 或 shell 需要不同版本的库,strictVersion: true 将导致错误。

这与角度服务无关,即使 lib 只加载一次,也不意味着它的服务将是单例的。

如果您希望服务成为跨多个模块的单例,您应该确保通过添加以下内容在根注入器中提供服务:

@Injectable({
  providedIn: 'root'
})

或者通过确保服务被声明为 shell 应用程序模块的提供者,而不是在任何其他模块中声明为提供者。

于 2021-07-01T12:39:14.467 回答