将 rxjs 存储包含在 angular2/4 中的最佳 practice/right 方法是什么,它应该在 bootstrap 中还是导入?

What is the best practice/right way to include rxjs store in angular2/4, is it supposed to be in bootstrap or import?

当我读到 ngrx 时,我看到了包含商店的不同方式:

我看到的一种方法是包括在导入中:

@NgModule({
    imports: [
        ... omitted
        StoreModule.provideStore(AppReducer),
    ],
    declarations: [
        AppComponent
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

我见过的另一种方法是将其包含在 bootstrap:

import {bootstrap} from 'angular2/platform/browser';
import {App} from './src/app';
import {provideStore} from '@ngrx/store';
import {ItemsService, items, selectedItem} from './src/items';
bootstrap(App, [
  ItemsService, // The actions that consume our store
  provideStore({items, selectedItem}) // The store that defines our app state
])
.catch(err => console.error(err));

哪个是正确的 and/or 是公认的最佳做法?为什么?

我从一个没有 rxjs 存储的项目中随机查看了一个 app.module.ts 文件,我想知道它应该在这样的文件中正确地放在哪里:

https://github.com/AngularClass/angular2-webpack-starter/blob/master/src/app/app.module.ts

有选择地欣赏任何关于 "current" 2017 年 5 月 angular2/4 应用程序应如何组织与 RxJS 集成的任何参考。

根据 ngrx 存储库中的示例,我在 imports 下提供了商店。

Example in readme in the ngrx repo:

@NgModule({
  imports: [
    BrowserModule,
    StoreModule.provideStore({ counter: counterReducer })
  ]
})

Official NGRX Example App 也做同样的事情。它放在 imports 下。

我不知道将内容放在 bootstrap 下有什么区别,但对我来说,将它分开到 NgModule imports 部分似乎更清晰。

我喜欢让我的 AppModule 尽可能干净。

有一天,当我用 Angular 思考模块结构和 SPA 设计时,我看到了来自 Wassim Chegnam 的 Tweet。这是关于 Angular 的模块,他画了这个:

我真的很喜欢拥有 3 个主要模块的想法 :
- 功能
- 共享
- 核心

如何使用它们:

  • 功能 与我们的应用程序直接相关的所有内容
  • Shared 用于我们想要从任何地方轻松导入的所有内容
  • Core 用于与项目配置相关的所有内容(主要是带有 forRoot 的模块)

所以在你的情况下,我会把 StoreModule.provideStore(AppReducer) 放在 CoreModule 中。 (example)

显然,您可以使用更简单的模块结构,但在我使用这种方式在 large application and a small/medium app to demo how to use ngrx (Pizza-Sync) 中做事后,感觉是件好事 =)。

最后,我确实有一个 AppModule 非常干净:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    CoreModule,
    SharedModule,
    AppRoutingModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

如果我需要使用 angular-universal,我可以毫无问题地从 app.module.ts 切换到 app.module.universal.ts

编辑:5 月 14 日(2017 年)
几天前,我在 Github 上发布了一个 ngrx 启动器,我试图在其中描述所有这些,并包含我在过去 8 个月中发现的很多好东西。有些人可能会感兴趣:https://github.com/maxime1992/angular-ngrx-starter