Angular 模块联合单例服务多次启动

Posted

技术标签:

【中文标题】Angular 模块联合单例服务多次启动【英文标题】:Angular module federation singleton service initiated multiple times 【发布时间】:2021-09-13 06:48:11 【问题描述】:

我正在关注这个 tutorial ,并尝试在 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 时,也许我遗漏了什么,但这不是 @987654323 的目的@config 是为了确保该服务只存在一个实例?

【问题讨论】:

【参考方案1】:

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

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

如果您希望服务成为跨多个模块的单例,您应该确保在根注入器中提供该服务,方法是添加:

@Injectable(
  providedIn: 'root'
)

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

【讨论】:

使用该教程,您必须从身份验证服务中删除@Injectable,否则,即使它指定了providedIn: 'root',它仍然会实例化两次。一次在 shell 应用程序中,然后再次在遥控器中。我在app模块中提供了服务

以上是关于Angular 模块联合单例服务多次启动的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有用于@angular/core 模块导入的相对路径

angular模块详解

使用 Karma 测试 Angular 时选择性地模拟服务

将 Typescript 2.3 模块发布到 NPM 以供 Angular 4 使用

Angular MFE - WebPack5 - 模块联合 - 图像路径问题

Angular,Webpack5 模块联合:您提供了一个无效的对象,其中需要流