嵌套模块在Angular中是不是很糟糕?

时间:2017-03-26 00:53:34

标签: angular typescript angular2-cli angular2-modules

我对模块有些疑惑。我刚刚开始使用Angular 2,所以我搜索了太多主题,但我找不到任何令人满意的答案。

当我们创建angular 2应用程序时,肯定使用模块。当然也使用嵌套模块。我们可以使用多少个嵌套模块?这是可行的还是嵌套模块有限制?

例如,假设我有管理仪表板应用程序。我们可以像这样构建

app.module.ts
|
 --dashboard
    |
    --dashboard.module.ts
      |
      --login
        |
        --login.module.ts
        .
        .
        .

我们可以确保以这种方式构建。但是,假设我们有5个或更多嵌套模块,角度应用是否可以?可能导致任何问题或导致任何性能问题?或者我们应该保持简单(最多3个嵌套等)进行练习?

当嵌套模块和组件增加时,tsc如何表现?

总结一下什么是优点,缺点嵌套模块等,嵌套模块结构的最佳实践是什么?

2 个答案:

答案 0 :(得分:10)

嵌套或不嵌套不是黑白情况。不幸的是,至于大多数软件开发,“它取决于。”

但是,我建议你考虑一下 - NgModule的重点(除了允许AOT的技术动机)是为你的应用程序提供更高级别的“单位”。换句话说,您可以将单个组件/服务/管道分组为离散分组,从而允许您将该分组视为提供一定功能的单个单元。在大多数情况下,这用于提供应用程序中的功能(所谓的“功能模块”),但NgModule系统也用于提供其他类型的横切关注点。实际上,库作者很容易将它们的库作为单个NgModule分发,封装了它们提供的所有功能。 (示例包括内置库,如HttpModule和FormsModule,还有MaterialModule,FlexLayoutModule等。)

这种将NgModule视为分发容器的用例有助于我思考如何对组件/服务/管道进行分组 - 这并不总是可行的,但我试着想我可以获取一个包含模块定义的文件夹,它的各个部分,应该能够将该文件夹放入任何其他应用程序,它应该基本上工作(假设存在其外部依赖项)。以这种方式思考它有助于我将重点放在制作NgModule的细节上。这并不是说我不在NgModule中嵌套文件夹,而只是因为嵌套的文件夹不会自动意味着我创建了一个NgModule - 除非这些项目作为某种类型的分发容器有意义,我不会打扰创建嵌套的NgModules只是为了匹配文件夹结构。

总而言之,您的文件夹结构并不自动意味着您为深层嵌套文件夹创建NgModule - 因此,可能不需要深度嵌套的NgModule设置。

答案 1 :(得分:1)

对我来说,使用NgModule的主要目标是延迟加载;我不是角度逻辑/特征结构的粉丝。如果角度没有延迟加载,我可能只是用这种方式构造代码:

components/
services/
pipes/
models/
...

延迟加载,嵌套模块与不嵌套它们没有区别。我可能决定哪些代码在同一页面上加载了哪些代码。例如,即使两个组件感觉它们属于相同的功能但它们位于不同的页面上,我希望它们位于各自页面的模块上,以便更好地延迟加载。< / p>

所以,我目前以这种方式构建我的代码:

app
|
 --services/
   |
    -- the services module called `CoreModule` in angular docs.
 --shared/
   |
    -- the shared module described in angular docs. Has models as well.
 --pages/
   |
    -- page1/
       |
        -- a module for page1/feature1 that I'll use in lazy-loaded manner (but may not do so if found unsuitable).
    -- page2/
       |
        -- a module for page2/feature2 that ...

所以,回答你关于嵌套的具体问题:

  • 嵌套模块实际上只是一个文件夹结构;对角度方式的非测试没有影响。嵌套模块就像一个顶级模块。例如,您可以在login.module.ts旁边的模块中导入dashboard
  • 由于它是一个文件夹结构,因此对角度嵌套的级别没有限制。
  • 但是,通常在嵌套模块中,你有一个模块X导入模块Y导入模块Z,...等。对于这一点,我不会,如果它对性能有影响或没有,但我不期待它。特别是在库依赖关系中存在相同的情况:使用来自某个npm包的角度组件/模块进行成像,该包使用另一个npm包中的另一个角度组件/模块,等等。
  • 我对嵌套模块的看法&amp;一般的代码结构,我已经在上面概述了它。

作为避免嵌套的来源,请参阅Angular's official Style Guide中的“尽可能保持平面文件夹结构”原则。一般来说,Style Guide似乎是类似问题的好地方(刚发现它!)。