2016-03-31 27 views
9

Das folgende Szenario: Ich baue eine AngularJS 2-App, die eine REST-API verwendet (die mit Elixir oder RoR oder was auch immer gebaut werden könnte). Während der Entwicklung möchte ich, dass AngularJS eine andere API verwendet als in der Produktion (vielleicht mit Testdaten, vielleicht weil ich die API zur gleichen Zeit erstelle und sie auf meinem Rechner läuft).AngularJS 2: Umgang mit der App-Konfiguration für verschiedene Umgebungen

Zusätzlich möchten andere Mitglieder meines Teams möglicherweise eine andere lokale API-Adresse verwenden. Das heißt, das sollte nicht in das Versionskontrollsystem gehen.

So könnte zum Beispiel die api_base_urlhttp://localhost:4000 für mich sein, http://testapi.local für meinen Kollegen und http://api.example.com für die Produktion.

Der Wert api_base_url sollte in mehreren Komponenten verfügbar sein.

Was ist ein guter Ansatz, um damit umzugehen?

Antwort

4

Sie könnten einen dedizierten Anbieter definieren, der diese Hinweise bereitstellt. So etwas ähnliches:

bootstrap(AppComponent, [ 
    (...) 
    provide('configuration', { 
    useValue: { 
     apiBaseUrl: 'http://localhost:4000' 
    } 
    } 
]); 

Wenn Sie Ihren Code für die Produktion verpacken, können Sie die Datei mit diesem Code mit dem man mit der Konfiguration für die Produktion ersetzen.

Zur Berücksichtigung dieser Konfiguration können Sie die RequestOptions Klasse erweitern alle Ihre Anfrage mit dem apiBaseUrl Präfix voranstellen:

import { 
    BaseRequestOptions, RequestOptions, RequestOptionsArgs 
} from 'angular2/http'; 

export class AppRequestOptions extends BaseRequestOptions { 
    constructor(private @Inject('configuration') configuration:any) { 
    } 

    merge(options?:RequestOptionsArgs):RequestOptions { 
    options.url = this.configuration.apiBaseUrl + options.url; 
    return super.merge(options); 
    } 
} 

Vergessen Sie nicht, die Anfrage Optionen zu konfigurieren, wenn die Anwendung Bootstrapping:

Diese Verarbeitung könnte in einer dedizierten JS-Datei enthalten sein, die innerhalb des Builds ersetzt würde (z. B. mit gulp und gulp-html-replace).

Sehen Sie diese Frage:

Für den letzten Schritt, auch basierend auf einer Konfigurationsdatei asynchron die Anwendung geladen werden konnte:

var injector = Injector.resolveAndCreate([HTTP_PROVIDERS]); 
var http = injector.get(Http); 

http.get('config.json').map(res => res.json()) 
    .subscribe(data => { 
    bootstrap(AppComponent, [ 
     HTTP_PROVIDERS 
     provide('config', { useValue: data }) 
    ]); 
    }); 

Sehen Sie diese Frage für Weitere Details:

+0

Aber das würde bedeuten, dass ich die richtige Konfiguration kopieren und einfügen muss, abhängig von der Umgebung. Ich denke, es wäre eleganter, wenn ich für jede Umgebung eine Konfigurationsdatei hätte, die nicht der Versionskontrolle unterliegt und für jedes Teammitglied individuell sein könnte. Kopieren und Einfügen vor dem Build scheint auch keine so gute Idee zu sein, wenn Sie einen automatischen Flow und CI haben möchten. –

+1

Es wäre kein manuelles Kopieren/Einfügen, sondern integriert in Ihrem Build (mit Schluck und Schluck-HTML-ersetzen zum Beispiel). Siehe diese Frage: http: // stackoverflow.com/questions/36285064/how-do-i-tatsächlich-deploy-an-angular-2-typescript-systemjs-app/36315060 –

+1

Eine andere Möglichkeit wäre, die Anwendung nach dem Laden einer Konfigurationsdatei zu laden. Ich habe meine Antwort entsprechend aktualisiert ... –

Verwandte Themen