Nx的feature库能否访问全局状态?如何不引用apps目录实现状态共享?
Nx Feature库访问全局状态的解决方案
完全不需要将特性迁回apps目录,通过以下符合Nx依赖边界规则的方案就能实现状态共享,无需让feature库依赖apps目录下的内容:
1. 抽离全局状态契约到共享数据访问库
- 不要把全局
AppState的定义放在apps目录下,单独创建一个可被所有feature库引入的shared/data-access/global公共库,将全局状态的类型定义、根选择器、核心通用操作都放在该库中 - feature库仅需要引入这个公共库的类型和选择器即可访问全局属性,完全不会依赖apps下的任何代码
- 举个实际用法:你可以在全局数据访问库里定义
export interface GlobalAppState { theme: ThemeState; user: UserState },以及对应的selectCurrentUser、selectGlobalTheme等根选择器,所有feature库直接引入这些选择器调用即可
2. 通过注入令牌实现状态解耦
- 如果你不想让feature库强依赖全局状态的完整定义,可以用注入令牌(比如Angular的
InjectionToken、React的Context、Redux的动态注入机制)定义全局状态的访问契约 - 在app启动阶段,把全局状态的实例/访问方法通过令牌注册到根注入器,feature库仅需要注入对应的令牌就能拿到所需的全局属性,完全不需要感知上层app的实现细节
3. 特性状态泛型扩展根状态
- 如果你使用的是NgRx、Redux这类状态管理方案,可以在feature库定义状态的时候,把全局状态设为泛型约束,不需要具体引入根状态的实现
- 示例代码:
// feature库内的状态定义 export interface FeatureState<T extends Record<string, unknown>> { currentFeature: FeatureInnerState; global: T; }
实际使用时由上层app传入具体的GlobalAppState类型即可,不会产生反向依赖
以上所有方案都严格遵循Nx的依赖规则:仅上层app可以依赖下层的库,库与库之间仅允许依赖更通用的下层共享库,不会出现库反向依赖apps目录的违规情况。
内容的提问来源于stack exchange,提问作者Nate May
相关产品推荐
相关产品推荐

