在Angular2中使用多个模块除了简化设计之外,还有什么好处?

4

它有助于减少加载时间吗?(例如只将当前模块加载到客户端设备中?)

我的理解是...

  • 它会增加服务器和客户端之间的请求次数吗?
  • 它会增加代码的复杂性。(因为你需要处理导入和导出模块,并在路由方面特别注意)
2个回答

10

Angular支持模块的惰性加载。这样,您可以将应用程序拆分为仅在需要时加载的部分。

{
  path: 'admin',
  loadChildren: 'app/admin/admin.module#AdminModule',
},

另请参阅https://angular.io/docs/ts/latest/guide/router.html#!#asynchronous-routing

更新

虽然懒加载不会减少在起始页面上需要加载的所有内容(在我看来,这种情况在近乎100%的Angular2应用程序中都不是这种情况),但它可以减少初始加载时间,并将加载时间延迟到实际需要模块时。 Angular还支持预加载功能,可以在需要之前加载懒加载的模块,但仍不会在初始加载时加载它们。

  • 这会增加服务器和客户端之间的请求数吗?

请求的数量会更多,但随着第一个请求加载的数据量的减少,用户获得第一个屏幕渲染所需时间将会减少。如果应用程序由一些部分组成,其中一些部分被广泛使用而其他部分则很少使用,那么通常最好不要在实际使用之前加载很少使用的部分-这意味着仅在需要时才进行“懒加载”或“按需加载”。

  • 这会增加代码的复杂性吗(因为你需要关注

如果您想充分利用懒加载的优点,就需要考虑应用程序架构。这并不意味着代码需要变得更加复杂。您只需要决定将组件、指令和服务放入哪个模块中。

  • 导入和导出模块,并在路由方面特别注意)

我在这里没有看到太大的区别,因为无论是否懒加载,您都应该将应用程序拆分为不同的模块(例如每个功能一个模块)。


没错。但在实际的商业应用中,这个 Angular 特性对于加载性能并没有太大的贡献(除了启动屏幕),因为一个典型的模块通常引用了几乎整个应用程序功能栈(数据服务等)。Angular 未来应该支持更细粒度级别的惰性加载。 - Karl
@Karl 不知道你的意思。你可以把模块做得尽可能细粒度(单个组件、指令或服务)。 - Günter Zöchbauer
不知道你为什么认为“它们都已经被加载了”。只有在引用它们的模块被加载时,它们才会被加载。 - Günter Zöchbauer
感谢@GünterZöchbauer提供的答案。所以基本上它会初始加载rootModule的所有组件,只有在需要时才调用childModule,是这样吧? - YASH DAVE
@YASHDAVE:我指的是Angular 2。Günther在更新他的答案时解决了我的问题。典型的业务应用程序具有其他业务组件使用的基础层。在Angular中,您可以将加载该层从启动屏幕转移到(首次加载的)业务组件。您无法控制此业务组件内单个模块、组件等的加载。 - Karl
显示剩余9条评论

2
我���认为这是一个针对Angular的特定问题。如果您在谷歌上搜索,会有很多关于为什么应该使用模块的答案,例如在这里看看:modules 现在简短回答您的问题:
  • 它不会帮助减少加载时间
  • 它将增加请求的数量
  • 它实际上通过解耦非相关功能并且不必污染全局命名空间来帮助减少代码的复杂性

3
当然会减少加载时间。如果起始页面不显示应用程序的某些部分(这在99.9%的应用程序中都是这样),那么它将减少初始加载时间。 - Günter Zöchbauer
1
让我们在这里明确一点-在问题的提问者没有指定“初始加载时间”的情况下。如果我们谈论的是应用程序的“加载时间”总体上不会减少,并且(至少目前来说)很可能会增加。 - Amid
可能是这样,但这可能是问题的错误,而且你的答案肯定是错误的。如果由于用户从未导航到这些路由而未加载多个模块,则加载时间肯定会更短。只有当所有或几乎所有模块实际上被使用时,加载时间才会累加到没有延迟加载时获得的加载时间(或更多)。 - Günter Zöchbauer
只要问题陈述的方式是这样的 - 我不认为我的答案是错误的。但无论如何,我认为作者会受益于知道这些差异。 - Amid
“它可能会”但“它不会帮助减少加载时间”是一个毫无根据的陈述,这并不正确。 - Günter Zöchbauer
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接