如何从 NPM 包中获取 Angular5 应用程序环境变量?
How get Angular 5 application environment variable from NPM package?
我有从 Angular 5 应用程序创建的节点模块,我有 Angular 5 应用程序必须使用该节点模块。有没有办法从我的节点模块中读取 Angular 5 应用程序环境变量(environments/environment.ts)?
也许 Angular 5 在构建后将其环境变量导出到 JavaScript 全局变量,我的节点模块可以从 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 演示此功能。
这就是我解决问题的方法。
我在我的节点模块中创建了摘要class
import { Injectable } from '@angular/core';
@Injectable()
export abstract class ConfigService {
constructor() { }
public abstract getAppConfigProperties(): any;
public abstract getAppEnvironmentProperties(): any;
}
我的主应用程序中的另一个 class 扩展了这个
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;
}
}
getAppConfigProperties
和 getAppEnvironmentProperties
方法 return 我在节点模块中需要的所有变量。最后,我将这一行添加到我的主应用程序模块中。
providers: [
AppConfigService,
{ provide: ConfigService, useExisting: AppConfigService },
...
现在我可以在我的节点模块中使用 ConfigService
函数从主应用程序获取我需要的信息。
@Injectable()
export class CoreService {
constructor( private configService: ConfigService ) { }
public getWhatIneed(): void {
console.log( this.configService.getAppConfigProperties() );
}
我有从 Angular 5 应用程序创建的节点模块,我有 Angular 5 应用程序必须使用该节点模块。有没有办法从我的节点模块中读取 Angular 5 应用程序环境变量(environments/environment.ts)? 也许 Angular 5 在构建后将其环境变量导出到 JavaScript 全局变量,我的节点模块可以从 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 演示此功能。
这就是我解决问题的方法。
我在我的节点模块中创建了摘要class
import { Injectable } from '@angular/core';
@Injectable()
export abstract class ConfigService {
constructor() { }
public abstract getAppConfigProperties(): any;
public abstract getAppEnvironmentProperties(): any;
}
我的主应用程序中的另一个 class 扩展了这个
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;
}
}
getAppConfigProperties
和 getAppEnvironmentProperties
方法 return 我在节点模块中需要的所有变量。最后,我将这一行添加到我的主应用程序模块中。
providers: [
AppConfigService,
{ provide: ConfigService, useExisting: AppConfigService },
...
现在我可以在我的节点模块中使用 ConfigService
函数从主应用程序获取我需要的信息。
@Injectable()
export class CoreService {
constructor( private configService: ConfigService ) { }
public getWhatIneed(): void {
console.log( this.configService.getAppConfigProperties() );
}