我正在谷歌搜索大约2周,但找不到任何合适的答案。所以我在这里问。
描述
工具:Angular 4.4.6和Angular-CLI 1.4.9
我正在处理相当简单的应用程序。它有AuthModule,AdminModule,LayoutModule和SharedModule。如果我将所有这些模块添加到AppModule,一切正常,但问题是当我添加这些模块时,AppModule然后我的供应商......大小超过600kb(--aot)。
模块说明。
ShareModule :具有每个模块共有的一些模型和服务,例如的 HttpService的即可。 AuthModule:包含使用共享模块 HttpService 的简单登录和注册组件
所以我决定将它们全部作为带有路由的延迟加载模块,这些模块被描述为here。这将供应商... js的大小减少了近50%,但随后依赖性不起作用。
虽然我在LazyLoaded模块中引用了SharedModule,但仍然无法解决问题,但依赖关系不起作用。我知道,每个延迟加载的模块都会创建自己的DI树,但它不会解析除了在延迟加载的模块中创建和提供的依赖项之外的其他依赖项。
正如我在工具部分中所说,我使用的是Angular-CLI,它具有检测在某些组件中使用两次的类似模块的强大功能,如果是这样,那么它会为该模块创建一个公共的... js。但仍然是问题仍然无法访问延迟加载模块中的共享服务。
是否有可能或有人指出如何在延迟加载的模块中加载共享服务?
由于
答案 0 :(得分:4)
如果您希望延迟加载的模块中的服务可用作全局单例并且随处可用,请在forRoot
中实施MyLazyModule.forRoot()
并导入AppModule
。这样,提供程序在全局注册,而其余的则是延迟加载的。
有关详细信息,请参阅https://angular.io/guide/ngmodule#configure-core-services-with-coremoduleforroot。
答案 1 :(得分:2)
我找到了解决方案。 agular documentation中提到的内容之前没有引起我的注意。
不要在共享模块中指定应用程序范围的单例
providers
。一个 导入该共享模块的延迟加载模块会创建自己的副本 服务。
您需要做的是不要从共享模块提供和服务。只需在延迟加载的模块中导入共享模块,并从该延迟加载的模块中提供服务。
我希望这会帮助别人。
快乐的编码。 :)