【问题标题】:How get Angular 5 application environment variable from NPM package?如何从 NPM 包中获取 Angular 5 应用程序环境变量?
【发布时间】:2018-06-01 08:26:56
【问题描述】:

我有从 Angular 5 应用程序创建的节点模块,并且我有必须使用该节点模块的 Angular 5 应用程序。有没有办法从我的节点模块中读取 Angular 5 应用程序环境变量(environments/environment.ts)? 也许Angular 5在构建后将其环境变量导出为JavaScript全局变量,我的节点模块可以从JavaScript中获取它?

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: javascript angular npm node-modules angular5


    【解决方案1】:

    节点模块不应直接从环境文件中读取。无法保证用户的环境文件在什么文件结构中,或者它们是否有环境文件。因此 node_module 应该与环境完全无关,而是应该在导入模块时传入一个变量。这使应用程序(及其环境文件)可以完全控制 node_module 使用的内容。

    // app.module.ts
    import { environment } from './environments/environment';
    
    
    @NgModule({
        imports: [MyNodeModule.setup(environment.myVar)]
    })
    export class AppModule {}
    

    这允许用户从他们自己的环境文件中传入静态值或动态值。


    更新

    要使传入的值可用于您的 node_module,您可以使用 InjectionToken

    export const MY_TOKEN = new InjectionToken<string>('My passed in token');
    

    在您的MyModule 中,您提供此令牌并为其分配传入的值。

    @NgModule()
    export class MyNodeModule {
        static setup(myToken: string) {
            return {
                ngModule: MyNodeModule,
                providers: [{ provide: MY_TOKEN, useValue: myToken }]
            }
        }
    }
    

    现在你的 node_module 的其余部分要使用令牌,你可以注入它。

    @Injectable()
    export class SomeService {
        constructor(@Inject(MY_TOKEN) private myToken){}
    }
    

    这是一个非常基本的stackblitz 演示此功能。

    【讨论】:

    • 我不会在模块中导入变量,而是创建一个配置服务,就像这样stackoverflow.com/questions/43193049/…
    • 感谢@LLai 的回答。听起来不错。我从来没有使用过设置。您能否举例说明 MyModule 如何获取该变量?
    • @MherAghabalyan 我已经更新了我的答案。我不确定您需要如何使用环境变量,但提供的 stackblitz 演示了如何将值传递给 MyNodeModule
    【解决方案2】:

    这就是我解决问题的方法。

    我在节点模块中创建了抽象类

    import { Injectable } from '@angular/core';
    
    @Injectable()
    export abstract class ConfigService {
        constructor() { }
        public abstract getAppConfigProperties(): any;
        public abstract getAppEnvironmentProperties(): any;
    }
    

    我的主应用程序中的另一个类扩展了这个类

    import { Injectable } from '@angular/core';
    import { ConfigService } from 'my_node_module';
    import {environment} from '../../environments/environment';
    import {appConfig} from '../app.config';
    
    @Injectable()
    export class AppConfigService extends ConfigService {
        public getAppConfigProperties(): any {
          return appConfig;
        }
        public getAppEnvironmentProperties(): any {
          return environment;
        }
    
    }
    

    getAppConfigPropertiesgetAppEnvironmentProperties 方法返回节点模块中我需要的所有变量。最后,我将此行添加到我的主应用程序模块中。

    providers: [
        AppConfigService,
        { provide: ConfigService, useExisting: AppConfigService },
    ...
    

    现在我可以在我的节点模块中使用ConfigService 函数从主应用程序中获取我需要的信息。

    @Injectable()
    export class CoreService {
        constructor( private configService: ConfigService ) { }
    
        public getWhatIneed(): void {
            console.log( this.configService.getAppConfigProperties() );
        }
    

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 2015-01-31
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多