如何将 ngrx-store-freeze 与 nx 工作区一起使用

Posted

技术标签:

【中文标题】如何将 ngrx-store-freeze 与 nx 工作区一起使用【英文标题】:How to use ngrx-store-freeze with nx workspace 【发布时间】:2018-09-08 03:39:26 【问题描述】:

我正在为我的应用程序使用 nx 工作区。我已将所有 reducer 放在 libs 部分,因为它们在多个应用程序之间共享。但是在创建 meta-reducer 时,我想使用 ngrx-store-freeze 进行开发。

推荐的方式是使用这一行: export const metaReducers: MetaReducer<State>[] = !environment.production ? [storeFreeze] : [];

但是当我不知道要导入哪个环境时,我怎么知道该应用程序是否是生产环境,因为我不知道哪个应用程序将在 nx 工作区中运行,并且 ngrx 减速器是纯函数,因此我无法注入环境?

【问题讨论】:

"但是我怎么知道应用程序是否正在生产" 当您将 --prod 标志传递到 cli 时(如果您正在使用它)。 “ngrx reducer 是纯函数,所以我不能注入环境?”是的,但配置创建不是。你的构建命令是什么样的? @bc1105 是的,我使用 --prod 命令,这就是我为生产构建它的方式。命令如下所示: ng build -a=myAppName --prod 【参考方案1】:

创建一个将为您创建元缩减器的函数。此函数接受一个参数,指示它是否用于生产模式。

export function createMetaReducers(freeze = false): MetaReducer<State>[] 
    return freeze
        ? [storeFreeze] 
        : [];

像这样,您的库并不关心您是否处于生产模式,而是您的库的用户可以决定。

关于您的评论的更新

我已经创建了一个函数,但我不能在我的 app.module.ts 中的导入部分中使用这个函数,在我这样做之前:'StoreModule.forRoot(reducers, metaReducers ),' 现在我已经尝试过了使用新函数 StoreModule.forRoot(reducers, createMetaReducers(true) ) 但得到错误:“类型的参数 ' createMetaReducers(: any): any; ' 不可分配给类型为 'StoreConfig' 的参数。”您将如何解决这个问题?

您已经解决了您的问题,但我想解释一下发生了什么。

Typescript 和现代 ECMA 脚本有一些语法糖来缩短某些内容。

假设您有一个要为其指定名称的对象:

const obj: any =  name: 'Tom' 

现在我们可能不会对名称进行硬编码,而是将其放在名为 name 的变量中。那么代码是这样的:

const name: string = 'Tom';
const obj: any =  name: name ;

您可以看到该变量与对象中的字段命名相同。如果是这种情况,您可以简单地删除 : name 部分并这样写:

const name: string = 'Tom';
const obj: any =  name ;

这段代码 sn-p 和上面的代码一样。

这叫做Object Literal Property Value Shorthand(如果我弄错了,请大家纠正我)你可以在这里找到更多信息:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/Object_initializer

现在回到您的代码。 StoreModule.forRoot 需要两个参数。第二个参数是一个配置对象,你可以在其中传入 meta reducers

StoreModule.forRoot(reducers,  metaReducers: [] )

因此,要解决此问题,您有 2 种可能性。

你做的很好:

const metaReducers = createMetaReducers();
StoreModule.forRoot(reducers,  metaReducers )

解决此问题的另一种方法是以下方法:

StoreModule.forRoot(reducers,  metaReducers: createMetaReducers() )

【讨论】:

感谢@tom van green 的提示。我已经创建了一个函数,但是在我这样做之前,我不能在我的 app.module.ts 的导入部分中使用这个函数:'StoreModule.forRoot(reducers, metaReducers ),' 现在我尝试使用新的函数 StoreModule.forRoot(reducers, createMetaReducers(true) ) 但得到错误:“类型的参数 ' createMetaReducers(: any): any; ' 不可分配给类型为 'StoreConfig' 的参数。”您将如何解决这个问题? 我已经通过在@NgModule 之前添加一行解决了这个问题。我像这样创建一个常量:'const metaReducers = createMetaReducers(environment.production);'然后使用这个新的 metaReducers const 来设置 StoreModule。这似乎对我有用。感谢您的帮助。 不客气。根据您的评论,我添加了一些关于出了什么问题的解释。

以上是关于如何将 ngrx-store-freeze 与 nx 工作区一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 For 循环与 char 一起使用?

如何按前 N 个类别与“所有其他”和总计进行汇总?

n皇后问题与2n皇后问题

如何使用numpy将矩阵与另一个矩阵中的每一行相乘

Python|如何求得任意N个整数的最大值与最小值

如何将M维数组转换为N维数组?