javascript - Bedste fremgangsmåde for konfigurationsfil til en Angular/RequireJS-applikation?


Er der en almindeligt accepteret bedste praksis for at vedligeholde en konfigurationsfil, der er tilgængelig på klientsiden (en slags ækvivalent til AppSettings-sektionen på serversiden i en ASP.NET-applikation)?

Vores applikation er baseret på Angular. Vores ønske er at eksternalisere miljøspecifikke indstillinger (som fjernsystem-URL'er osv.) fra selve koden, så ideelt set kan en driftsmedarbejder og ikke en udvikler ændre indstillinger ét sted.

Tak på forhånd for enhver indsigt!

Svar #1

Jeg synes ikke, det er en god idé at bruge en config.js-fil, når man udvikler AngularJS-apps. Årsagen er, at du vil ødelægge enhver mulighed for automatisk testning.

I stedet opretter jeg en "Indstillinger"-tjeneste, hvor jeg angiver min app-specifikke kontekst. For eksempel:

angular.module('settings',[]).factory('SettingsService',function(){

   var service={};

   // Insert your settings here
   service.ServerPath = 'whateverwhatever';
   service.ImagePath  = 'bla bla bal';

   return service;

});

Indsæt derefter SettingsService i controllere, der har brug for adgang til indstillingerne.

Selvfølgelig (hvilket jeg udelod for enkelheds skyld her), kunne du i stedet oprette ServiceService med en tom krop, og derefter hente indstillingerne fra serveren i applikationens .run() metode.

Jeg bruger den simpelt beskrevne metode og opretholder en SettingsService for hver deployment-type ("development", "test", "production" osv.). Inkluder derefter bare den rigtige SettingsService i dit build-script afhængigt af målet (jeg bruger Grunt, men du kan også bruge Ant).

Svar #2

Jeg tror, at svaret på dette i høj grad afhænger af, hvordan du opsætter dit Angular-lag i den overordnede struktur af applikationen.

For eksempel har jeg serveret en Angular-applikation på samme måde for hvert miljø fra den grundlæggende serverapplikation (Grails, node.js, RoR), og Angular-applikationen er altid den samme kodebase, fordi de data, jeg sender til Angular, styres af serversiden, og Angular-opkald er alle relative til basis-URL'en. Med andre ord proxyer jeg alle data gennem serverappen, der serverer Angular-applikationen, så alt hvad Angular-appen "ved om" er sin egen URL.

Hvis du direkte kalder andre tjenester og ikke bruger basisserverapplikationen til at proxy dataene, kan du måske stadig bruge serveren til at give dig URL'erne afhængigt af nogle konfigurationer på serversiden af applikationen. I dette tilfælde kan du altid gemme disse konfigurationsværdier i en database-tabel, så det er muligt at ændre dem dynamisk.