首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NX + NestJS:共享NX环境变量

NX + NestJS:共享NX环境变量
EN

Stack Overflow用户
提问于 2022-01-29 19:11:09
回答 1查看 1K关注 0票数 0

我阅读了一个旧线程,其中建议共享NX环境变量,如下所示:

代码语言:javascript
复制
import { environment } from '../environments/environment';

@Module({
    providers: [
        {
            provider: 'someProviderName',
            useValue: environment.someEnvironmentValue
        }
    ],
    MyService
})
class AppModule {
}

然后,你访问他们就像:

代码语言:javascript
复制
@Injectable()
class MyService {
    constructor(@Inject('someProviderName') someEnvironmentValue: someType) {
    }
}

理由是:

  1. 它能让你的利伯斯独立。
  2. 它允许您构建一次lib,而不知道它们所使用的应用程序或它们运行的env。

如果您只需要访问AppModule中的环境变量,那么这很好,但是如何与导入的库模块共享这些环境变量呢?特别是其源不在文件?的同一个项目中的库模块。

是否每个需要访问环境变量的库模块都需要是一个动态模块(以及它的所有父模块)才能以这种方式利用环境变量?因此,您是否需要将forRoot 调用链接到任何需要访问这些变量的模块?

例如:

代码语言:javascript
复制
                            AppModule: DynamicModule
                                    |
                            CoreModule: DynamicModule
                                |           |
     SomeFeatureModule: DynamicModule     SomeOtherFeatureModule: NestModule
  1. AppModule (需要ENV使它成为一个带有ForRootDynamicModule )
  2. CoreModule (需要来自AppModule的env,这样它就变成了带有ForRootDynamicModule
  3. SomeFeatureModule需要来自CoreModule的env,因此它变成了带有forRootDynamicModule )
  4. ..。就这样等等。

另外,如果所有需要环境值的模块都变成了DynamicModule ,那么对性能有什么影响呢?

示例:

代码语言:javascript
复制
@Module({})
export class MyLibModule {
  static forRoot(providers: Provider[]): DynamicModule {
    return {
      module: MyLibModule ,
      providers: [...providers],
    };
  }
}
代码语言:javascript
复制
const ENV_VALUE_PROVIDERS: ValueProvider[] = [
  {
    provide: 'PRODUCTION',
    useValue: environment.production,
  },
];
@Module({
  providers: ENV_VALUE_PROVIDERS,
  imports: [MyLibModule.register(ENV_VALUE_PROVIDERS)],
})
export class AppModule {}

为什么NestJS强制任何库模块动态访问这些类型的环境变量,在这种情况下,这些变量在编译时是可用的?

我想到的唯一其他解决方案是创建一个库模块,它由每个需要环境变量的模块导入。这个模块将在AppModule中使用要导出的环境变量使用forRoot进行初始化。这个解决方案的问题是许多库将直接依赖于这个模块。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 20:24:14

对于DynamicModule上的所有问题,我仍然没有答案,但就目前而言,我通过以下方式解除了自己的障碍:

使用ValueProvider注入变量,然后在模块中使用“工厂”选项对象传递模块所需的特定环境变量。

下面是一些基本的未测试代码,说明了这个概念:

app/环境/环境。

代码语言:javascript
复制
export class Environment {...}

app/app.module.ts

代码语言:javascript
复制
import { environment } from 'environments/environment';

Module({
  providers: [{ provide: Environment, useValue: environment }],
  imports: [
    MyModule.register({
      provide: MyModuleOptions,
      value: (environment: any) => environment.MyModuleOptions,
      inject: [Environment],
    })
  ],
})
export class AppModule {}

lib/my-module.module.ts

代码语言:javascript
复制
@Module({
  providers: [SomeProviderThatUsesMyModuleOptions],
  exports: [SomeProviderThatUsesMyModuleOptions]
})
export class MyModule {
  static register(
    options: MyModuleOptions | Provider<MyModuleOptions>)
: DynamicModule {
    ...
    return {
      module: MyModule,
      providers: [MyModuleOptions]
      ...
    };
  }
}

这篇文章更详细地介绍了核心概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70908879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档