繁体   English   中英

如何从NPM包中获取Angular 5应用程序环境变量?

[英]How get Angular 5 application environment variable from NPM package?

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

我将不胜感激

节点模块不应直接从环境文件读取。 无法保证用户的环境文件所处的文件结构,甚至没有环境文件。 因此,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

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

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

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() );
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM