Angular:每个组件一个模块:反模式?

Angular: one module for every component: antipattern?

所以我遇到了这样一种做法,人们会为每个具有服务依赖性的组件创建一个模块。这样,当有人想要使用给定的组件时,他们不必通读代码来查看将哪些提供程序添加到给定的模块。这是反模式吗?它会导致性能问题还是什么?

是否有一些关于 lower/upper 限制给定模块中 components/directives/providers/etc 数量的建议指南?是否对 angular/angularJs 生态系统进行了 100 多个模块的测试?与是否仅将常规组件全部捆绑在 20 个左右的模块中相比?

一般来说,Angular 中有不同的 module types 以及关于它们应该包含什么以及应该导入哪些模块的指导:

  • 小部件模块 - 主要包含 UI 组件,但不包含服务。由功能模块导入。
  • 功能模块 - 包含特定领域的私有组件。由 AppModule 导入。
  • 服务模块 - 专门包含服务。由 AppModule 导入。
  • 路由模块 - 一个专门的功能模块,它是路由的目标。
  • 路由模块 - 包含导航路由和 resolver/guard 服务。

模块可以依赖于其他模块。例如,Widgets 模块可能会与 Services 模块一起使用,其中 AppModule 导入 ServicesModule,而 FeatureModule 导入 WidgetsModule。 BrowserModule/CommonModule 就是这种模式的一个例子; RouterModule.forRoot()/RouterModule.forChild()也是如此。

我会说每个组件一个模块是大材小用。很难将通用功能组织和组合在一起并以任何有意义的方式利用服务。当您将单个模块 运行 导入两位数时,它很容易变得笨拙。

[编辑]

重读这个问题后,我想补充说明,因为我认为使用 NgModule 封装的单组件方法值得更多关注。我不相信 1:1 模块到组件——那太过分了。但是,我完全支持 1:many 模块到组件,其中模块仅导出一个组件,所有其他组件都是模块私有的。后一种方法称为 NgModule 封装,它是一种以松散耦合顶级组件的方式构建应用程序的绝佳方法。

如果你有一个相对较小的应用程序,那么膨胀单个模块是可以的。一旦您的应用程序开始变得相对较大,那么开始延迟加载模块就很有意义,这样您的用户就不必在应用程序启动时下载整个构建。将相关功能分组到模块中也使事情更容易维护。

因此,对于小型站点,单个模块就可以了,但随着您的应用程序的增长,开始将组件和服务重构到模块中是有意义的。

实际上,angular 总是希望您拥有基本模块 -

  • 功能模块、共享模块、路由模块、核心模块,

但是如果应用程序很大,最好对模块进行延迟加载,为每个组件都加载模块是最好的选择,这会随着浏览器加载所需的组件而提高应用程序速度。