【问题标题】:Lazy loading and providers strategy延迟加载和提供者策略
【发布时间】:2018-03-24 07:51:30
【问题描述】:

现在,使用 Angular v5,在使用延迟加载时,我将所有提供程序加载到 app.module.ts 中,我想这可能不是最好的策略,因为这不会加快我的应用程序启动时间,特别是因为我我有 50 个自定义提供商(不要评判我;))。

因此,我问自己是否真的应该为我的所有应用程序加载所有这些,或者我是否应该只在我只使用它们的地方加载它们?

我猜最好只在我真正使用它们的地方加载提供程序。

但在这种情况下,我完全不清楚如何解决以下构造:

假设我有三个页面(A、B 和 C),它们有自己的模块和三个提供程序(1,2 和 3)。

A use 1
B use 1, 2, 3
C use 1, 2
  • 我猜,因为 1 在所有应用程序中都使用,我必须在 app.module.ts 中声明它

  • 由于 3 只在页面 B 中使用,我想我只需要在 B.module.ts 中声明它

  • 但是 2 呢?我如何在B.module.tsC.module.ts 中声明它以共享相同的提供者“内存”(如果提供者包含一个值,B 和 C 都应该看到相同的对象),我将如何分别编码?只需“像往常一样”注入提供者,然后用角度来完成其余的工作吗?

提前感谢您的帮助,将不胜感激

更新

不确定我是否正确理解了角度文档,但这是目标,应该为所有应用程序加载提供程序,对吗?

https://angular.io/guide/ngmodule-faq#q-component-scoped-providers

2018 年更新

随着 Angular v6 的引入,注入策略发生了变化。根据文档,providedIn 可以指定服务应该在哪个模块中使用。见https://angular.io/guide/dependency-injection

【问题讨论】:

    标签: angular ionic-framework angular-module angular-providers


    【解决方案1】:

    答案是您应该在app.module.ts 中添加您的提供程序,因为它是一个单例服务。这里来自angular dependency injection doc

    依赖是注入器范围内的单例

    这意味着当您在 app.module.ts 中声明您的提供程序时,它将在整个应用程序中是单例的,并且注入它的每个模块都将共享它的相同实例。
    当您在单独的模块(即B.module.tsC.module.ts)中声明您的提供者时,您的B page 将使用提供者的实例,而C page 将使用提供者的另一个 实例。这不是提供者的目的。

    【讨论】:

    • 是的,我认为你是对的,在结束这个问题之前可以在本地做更多的测试。谢谢
    • @PeterParker:你测试了吗?
    • 抱歉,我赶时间了,本周没有时间进行测试,而且很可能没有时间进行测试。关于“这不是提供者的目的”,我不会说是和否。是的,如果你想要单例,你必须在 app.module 中声明它们,但似乎 angular 也告诉我们可以限制组件的范围以在模块中声明提供程序,请参阅angular.io/guide/…
    • 我确实将此答案标记为有效答案。如果我理解正确您使用无状态提供程序,那么是的,您可以在单独的模块中声明它们,因为如果这样做,每个模块将使用自己的提供程序(“同一提供程序的多个实例之间没有内存共享”) b。您的提供程序不是无状态的,例如您使用它们将值保存在内存中,然后它们只需分别在 app.module.ts 中为所有应用声明一次
    【解决方案2】:

    您应该创建一个共享模块来强化您的提供者 2,并且 B 和 C 模块包含在它们的依赖项中。

    编辑:您不需要导出提供程序。

    【讨论】:

    • 有趣,那将是一个没有任何声明的共享模块,对吧?类似@NgModule({providers: [2], exports: [2]})
    • 它可以工作,它可以与我在多个其他模块中需要的模块一起工作。
    • 不起作用,我也只是再次浏览了文档,现在我认为这可能是设计上不可能的,不推荐
    • 它在延迟加载上下文中实际上不起作用,因为每个页面都有自己的模块。如果没有实现延迟加载,共享模块将起作用。
    • 从 OP 和 @Joyce 支持上面的 cmets,我刚刚尝试过这个,在加载延迟加载的页面时,每个页面都会调用一次提供程序的构造函数,创建 2 个实例。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多