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