2017-12-18 35 views
0

노드 모듈을 앵귤러 5 응용 프로그램에서 만들었으며 해당 노드 모듈을 사용해야하는 앵귤러 5 응용 프로그램이 있습니다. 내 노드 모듈에서 Angular 5 응용 프로그램 환경 변수 (environments/environment.ts)를 읽을 수있는 방법이 있습니까? 아마도 Angular 5는 환경 변수를 자바 스크립트 전역 변수로 내 보낸 후 빌드하고 노드 모듈은 JavaScript에서 가져올 수 있습니까?NPM 패키지의 Angular 5 응용 프로그램 환경 변수는 어떻게 달라 집니까?

내가 어떤 도움

답변

0

내 문제를 해결하는 방법입니다.

내 노드 모듈

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

노드 모듈은 직접 환경 파일에서 읽을 안에 감사 할 것이다. 사용자의 환경 파일이 어떤 파일 구조인지 또는 환경 파일이 있는지 여부는 보장 할 수 없습니다. 따라서 node_module은 환경에 전혀 영향을 미치지 않아야하고 대신 모듈을 가져올 때 변수를 전달해야합니다. 이것은 node_module이 무엇을 사용하는지에 대한 완전한 제어권을 응용 프로그램과 환경 파일에 제공합니다.

// app.module.ts 
import { environment } from './environments/environment'; 


@NgModule({ 
    imports: [MyNodeModule.setup(environment.myVar)] 
}) 
export class AppModule {} 

이렇게하면 사용자가 자신의 환경 파일에서 정적 값이나 동적 값을 전달할 수 있습니다.


업데이트

당신의 InjectionToken

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

를 사용할 수있는 귀하의 node_module 사용할 수 값 전달 확인하기 위해 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 아주 기본적인 것입니다.

+0

나는 모듈에 변수를 가져올 수 있지만,이 같은 설정 서비스, https://stackoverflow.com/questions/43193049/app-settings-the-angular-4-way/43193574#43193574를 만들 것 – masterfloda

+0

답장을 위해 감사합니다. @LLai. 그것은 나에게 좋은 소리. 나는 결코 셋업을 사용하지 않았다. MyModule이 어떻게 그 변수를 얻을 수 있는지 예제를 제공해 주시겠습니까? –

+0

@MherAghabalyan 답변을 업데이트했습니다.어떻게 환경 변수를 사용해야하는지 잘 모르겠지만, 제공되는 stackblitz는'MyNodeModule'에 값을 전달하는 방법을 데모합니다. – LLai