如何在NX工作区的共享libs中配置ngrx-store-freeze?
在NX工作区的共享libs中判断生产环境以使用ngrx-store-freeze
在NX工作区里,共享libs确实没法直接依赖某个应用的environment文件——毕竟libs是为多个应用服务的,硬编码导入某一个应用的环境配置会破坏共享性。这里有两个比较优雅的解决方案:
方案一:让应用传入环境状态(推荐)
核心思路是把meta-reducer的控制权交还给使用它的应用,让每个应用根据自己的环境来决定是否启用storeFreeze。
- 在你的共享libs中,创建一个生成meta-reducers的函数,而不是直接导出固定的数组:
import { MetaReducer } from '@ngrx/store'; import { storeFreeze } from 'ngrx-store-freeze'; import { State } from './path-to-your-state'; // 接收是否为生产环境的参数,返回对应的meta-reducers数组 export function createMetaReducers(isProduction: boolean): MetaReducer<State>[] { return isProduction ? [] : [storeFreeze]; }
- 在每个应用的根模块中,导入自己的
environment,并调用这个函数传入环境状态:
import { NgModule } from '@angular/core'; import { StoreModule } from '@ngrx/store'; import { createMetaReducers } from '@your-workspace/shared-libs'; // 替换成你的libs路径 import { environment } from '../environments/environment'; import { reducers } from './path-to-app-reducers'; @NgModule({ imports: [ StoreModule.forRoot(reducers, { metaReducers: createMetaReducers(environment.production) }) ] }) export class AppModule {}
这种方式完全符合NX的模块化设计,每个应用自主控制环境配置,libs只负责提供逻辑,没有耦合。
方案二:通过构建时全局变量注入
如果你希望在libs中直接判断环境,可以利用NX/Angular的构建配置注入全局变量:
- 打开应用的
angular.json,在build目标的options里添加define配置:
"projects": { "your-app": { "architect": { "build": { "options": { // 其他配置... "define": { "IS_PRODUCTION": false // 开发环境设为false } }, "configurations": { "production": { // 其他生产配置... "define": { "IS_PRODUCTION": true // 生产环境设为true } } } } } } }
- 在你的libs中,声明这个全局变量并使用:
import { MetaReducer } from '@ngrx/store'; import { storeFreeze } from 'ngrx-store-freeze'; import { State } from './path-to-your-state'; // 声明全局变量,避免TS报错 declare const IS_PRODUCTION: boolean; export const metaReducers: MetaReducer<State>[] = IS_PRODUCTION ? [] : [storeFreeze];
不过这种方式需要确保所有使用该libs的应用都正确配置了define,维护成本稍高,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Tim Pickin
相关产品推荐
相关产品推荐

