Angular 使用ngrx的应用程序的最佳结构是什么?

Angular 使用ngrx的应用程序的最佳结构是什么?,angular,ngrx,Angular,Ngrx,结构1 reducers index.ts //Combine all reducers user.reducer.ts product.reducer.ts actions index.ts //Combine all actions user.action.ts product.action.ts effects index.ts //Combine all effects user.effect.ts product.effect.t

结构1

reducers
   index.ts //Combine all reducers
   user.reducer.ts
   product.reducer.ts
actions
   index.ts  //Combine all actions
   user.action.ts
   product.action.ts
effects
   index.ts //Combine all effects
   user.effect.ts
   product.effect.ts
selector
   //Combine all selectors
   user.selector.ts
   product.selector.ts


我发现第一种结构非常适合一个相当小的应用程序,在应用程序的几个智能组件中使用减缩器、动作或其他

虽然它促进了关注点的分离,但我发现在不同的目录之间跳转是相当乏味的

通常,使用(即,
user.reducer.ts
)会涉及到其他文件:效果、操作等。因此,第二种方法看起来更整洁一些

我想建议第三种可能适合的结构,一种遵循angular2中“桶”方法的结构:

- store
    - user
        - index.ts
        - user.actions.ts
        - user.effects.ts
        - user.reducer.ts
        - user.reducer.spec.ts

    // the store definition file - will expose reducer, actions etc..
    // for connecting those to the app in the bootstrap phase
    - index.ts
在这种结构下,用户目录是一个桶,它公开了各种逻辑组件,这些组件只需导入用户即可单独导入,即:

import { reducer as UserReducer } from '../store/user'; 
// or
import { UserReducer } from '../store/user' 
我正在我的开源媒体播放器应用程序中试用这些方法---

如另一条评论中所述,这些应用于回声播放器的策略和架构在

中汇编。我遵循本指南了解最佳ngRx实践和结构:

你提到的第二种方式是最好的,因为(引用样式指南):

执行在reducer目录中为以下内容创建单独的文件:reducer、reducer的规范、reducer的操作和reducer的选择器。最后,将index.ts用作导出每个文件内容的桶。 为什么?开发时更容易找到每个相关类/文件


你能在代码中添加更多的注释吗?我个人喜欢第一种方法。这是ngrx团队在示例应用程序中使用的结构。除此之外,您还有一个用于接口或类的文件夹,并且经常会在多个减速器上使用相同的接口。您还经常在多个效果上使用相同的操作,以此类推。这就是我喜欢第一种结构的原因。我不确定是否有一种理想的方法来实现这一点。样式指南(现在已经过时)说要根据SRP将存储区与组件分开。这有点可疑,因为您的组件将与状态和存储实现紧密耦合。。。因此,将其移动到自己的文件夹会产生一种人为的分离感。我还没有看到一个好的状态管理系统,它可以很好地与angular配合,并且没有太大的缺点。我真的很喜欢秋田在管理状态方面的简单性,但问题的核心是相同的:即什么是最好的文件夹结构和关注点的分离。这也是我的想法。我也以同样的方式学习。然而,基于特征的划分(对我来说)的一个大问题是,一些特征依赖于其他特征。每次发生这种情况时,我都会绞尽脑汁想如何将它们最干净地分开。这是使用ngxs schematic starter工具包时的默认结构-当我使用这种结构时,我非常喜欢这种结构,我最终得到了循环导入警告,由于每个特征中的桶形文件,当一个特征的效果使用另一个特征的动作时,反之亦然。如何避免这种情况?我没有找到更好的解决方案,而不是将动作放入动作/文件夹,将效果放入效果/文件夹,并将减缩器放入减缩器/文件夹,每个文件夹都有桶文件。
import { reducer as UserReducer } from '../store/user'; 
// or
import { UserReducer } from '../store/user'