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 模块联合单例服务多次启动的主要内容,如果未能解决你的问题,请参考以下文章
将 Typescript 2.3 模块发布到 NPM 以供 Angular 4 使用