¿Pasar variables de entorno a una aplicación Angular2?


Necesito pasar la url del backend a mi aplicación Angular2, ya que los servidores de producción y dev están alojados en diferentes ubicaciones.

Sé que podría almacenar tales cosas en una configuración externa.json y carga al iniciar. Sin embargo, esto parece una llamada adicional innecesaria al servidor antes de que la aplicación pueda comenzar.

Alternativamente, lo que hago ahora es crear una sola variable global, que inyecto en gulp dependiendo de la compilación. Mi aplicación no es una lib que necesita ser reutilizable No creo Debería golpear inesperados choques de nombres globales. Pero no es una buena práctica.

Me pregunto si hay una tercera, mejor solución?

Author: Zlatko, 2016-04-10

6 answers

Me gustaría ver dos maneras de hacer eso:

  • Aproveche una configuración JSON en un archivo. Este archivo se cargaría antes de boostrapear la aplicación:

    var app = platform(BROWSER_PROVIDERS)
       .application([BROWSER_APP_PROVIDERS, appProviders]);
    
    var http = app.injector.get(Http);
    http.get('config.json').subscribe((config) => {
      return app.bootstrap(AppComponent, [
        provide('config', { useValue: config })
      ]);
    }).toPromise();
    

    Aquí hay un plunkr correspondiente que describe el enfoque global: https://plnkr.co/edit/ooMNzEw2ptWrumwAX5zP?p=preview .

  • Aproveche un módulo de configuración:

    export const CONFIG = {
      (...)
    };
    

    Que se importará e incluirá en los proveedores al bootstrapping solicitud:

      import {CONFIG} from './config';
    
      bootstrap(AppComponent, [
        provide('config', { useValue: CONFIG })
      ]);
    

Con los dos enfoques, se puede definir la configuración para cada entorno al empaquetar la aplicación.

Esta pregunta también podría darle pistas sobre cómo empaquetar una aplicación Angular2:

 11
Author: Thierry Templier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:47

Simplemente coloque variables dentro del objeto environment.

export const environment = {
  production: false,
  url: 'http://localhost:3000/api'
};

Después de eso, puede importarlo y usarlo. Angular Cli intercambiará archivos automáticamente.

import { environment } from '../environments/environment';

P.d. Las variables están disponibles en el objeto de entorno.

this.url = environment.url
 16
Author: Boris Siscanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 14:17:59

He estado luchando con lo anterior por un tiempo también. Y aunque la respuesta de Thierry es muy buena, pero de alguna manera me resulta demasiado complicada para simplemente tener env vars, así que pensé que también presentaría mis pensamientos.

1) Primero creé una interfaz describiendo mis env vars app.settings.ts:

export interface IEnvVars {
    ENV: string;
    API_URL: string;
}

export class AppSettings {
    public static env_vars: IEnvVars;
}

2) Agregué las definiciones de tipo API de búsqueda de JavaScript a mi .archivo d. ts. (No es absolutamente necesario si no te importa tener fetch como sin resolver, pero me importó, por lo que agregó el tipos)

3) Así que ahora en mi main.ts puedo hacer una llamada al endpoint que devuelve las variables de entorno:

import {bootstrap}    from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {AppSettings,IEnvVars} from "./configs/app.settings";
import {enableProdMode} from "angular2/core";

fetch('/env-vars', {method: 'get'}).then((response) => {
    response.json().then((env_vars:IEnvVars) => {
        AppSettings.env_vars = env_vars;
        if (AppSettings.env_vars.ENV != 'development') enableProdMode();
        bootstrap(AppComponent);
    });
});

Así que ahora puedo acceder a mis env vars en cualquier servicio o componente simplemente por:

import {AppSettings} from "../configs/app.settings";

Así que dentro de un método etc. usted podría ir como:

let customersURL = `${AppSettings.env_vars.API_URL}/customers`;

Tenga en cuenta que es posible que necesite polyfills para fetch API ya que Safari e IE aún no admiten esto. (Enlace a polyfill exampel )

 6
Author: XGreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 20:06:01

Creo que esto podría ser útil para usted. Pasando asp.net parámetros del servidor para Angular 2 app

De esta manera puede inyectar cualquier valor de la página html (que puede obtener valor del servidor, como la variable de entorno actual)

 2
Author: ravi punjwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:34

He implementado esto usando el siguiente enfoque:

  1. Creado ts archivos para cada entorno.
  2. Modificado package.json y añadido una nueva entrada para cada entorno en la sección scripts.

Por ejemplo:-

"start: local": "copy \" config / config.local.ts\" \"constantes/global.constante.ts\" && npm run start"

  1. Importa global.constants a tu app.
  2. Puede iniciar su servidor HTTP usando: npm run start:local
 1
Author: Balaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-19 05:06:22

En diferentes entornos , el valor de location.host será diferente.

Use esto como la clave y cargue los valores de la json correspondiente que tenga todas las URL.

El código relevante puede tener este aspecto:

let env = location.host;
if (env === 'prod.example.com') {
  config = 'ProdConfig.json';
} else if (env === 'test.example.com') {
  config = 'TestConfig.json';
} else if (env === 'localhost') {
  config = 'DevConfig.json';
}
 0
Author: student,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-27 05:16:34