Cómo verificar si la aplicación angular se ejecuta en modo Producción o Desarrollo

131

Esto parece fácil, pero no pude encontrar ninguna solución.

Entonces, ¿cómo verifico si mi aplicación se está ejecutando en modo de producción o en modo de desarrollo?

maxbellec
fuente

Respuestas:

199

Puede usar esta función isDevMode

import { isDevMode } from '@angular/core';

...
export class AppComponent { 
  constructor() {
    console.log(isDevMode());
  }
}

Una nota : tenga cuidado con esta función

if(isDevMode()) {
  enableProdMode();
}

Conseguirás

Error: no se puede habilitar el modo de producción después de la configuración de la plataforma

Otras opciones

Variable ambiental

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

if (environment.production) {
  //
}

inyectado por webpack process.env.NODE_ENV variable

declare let process: any;
const env = process.env.NODE_ENV;

if (env  === 'production') {
  //
}
yurzui
fuente
Recibo el mismo error que mencionaste. "No se puede habilitar el modo prod después de la configuración de la plataforma". ¿Podrías ayudarme a resolver esto? @yurzui
Gowtham
@Gowtham Tienes que habilitarlo antes de llamarplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui
Así es exactamente como lo llamo. Todavía recibo este error cada vez que intento ejecutar la aplicación en modo de producción @yurzui. Cualquier ayuda para resolver esto sería muy apreciada. Gracias
Gowtham
@Gowtham ¿Tienes algún ejemplo para reproducirlo?
yurzui
2
angular.io/api/core/isDevMode "Después de llamar una vez, el valor está bloqueado y no cambiará más". ¡La respuesta debe incluir el documento y esta advertencia!
jasie
38

Según la guía de implementación angular en https://angular.io/guide/deployment#enable-production-mode :

Construir para la producción (o agregar el indicador --environment = prod) habilita el modo de producción Mire el CLI generado main.tspara ver cómo funciona.

main.ts tiene lo siguiente:

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

if (environment.production) {
  enableProdMode();
}

Así que verifica environment.productionsi estás en producción.

Lo más probable es que NO quieras llamar isDevMode(). Según la documentación de la API angular en https://angular.io/api/core/isDevMode :

Después de llamar una vez, el valor está bloqueado y no cambiará más ... Por defecto, esto es cierto, a menos que un usuario llame a enableProdMode antes de llamar a esto.

Descubrí que llamar isDevMode()desde una ng build --prodcompilación siempre devuelve verdadero y siempre te bloquea para ejecutarte en modo dev. En cambio, verifique environment.productionsi está en producción. Entonces permanecerás en modo de producción.

Ron DeSantis
fuente
2
Esta debería ser la respuesta aceptada. (Enlace y explicaciones de documentos adecuados.)
jasie
1
El hecho de que el valor no cambie no implica que no desee llamarlo. No debe cambiar del modo de desarrollo al modo de producción y viceversa mientras se ejecuta su aplicación. Entonces, cuando intenta determinar si debe habilitar el modo de producción, la variable de entorno es el camino correcto, pero si tiene un servicio que debe comportarse de manera un poco diferente cuando está en modo de desarrollo, isDevMode()es una forma perfectamente buena de lograrlo ese.
StriplingWarrior
4

depende de lo que estés preguntando ...

Si desea conocer modeAngular, como dijo @yurzui, debe llamar, { isDevMode } from @angular/corepero solo puede regresar falsesi llama enableProdModeantes.

Si desea conocer el entorno de compilación , en otras palabras, si su aplicación se ejecuta minimizada o no, debe establecer una variable de compilación en su sistema de compilación ... Utilizando Webpack, por ejemplo, debería echar un vistazo definePlugin.

https://webpack.github.io/docs/list-of-plugins.html#defineplugin

new webpack.DefinePlugin({
  ENV_PRODUCTION: !!process.env.NODE_ENV
});
Hitmands
fuente
En realidad estaba buscando los dos. Estoy usando webpack (a través del angular-cli), ¿dónde agrego sus líneas de código? ¿Cómo tengo acceso a esa variable en mis archivos de mecanografiado? Sería genial si pudieras actualizar tu respuesta con eso
maxbellec
Siguiendo esta ngcli.github.io/#getting-started-project-structure debe editar el webpack.config.js y luego seguir el enlace en mi respuesta ...
Hitmands
El enlace en su publicación está desactualizado, aquí está el correcto para el complemento Define
HostMyBus
2
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
import { enableProdMode } from '@angular/core';
import { AppModule } from './app.module'


platformBrowserDynamic().bootstrapModule(AppModule);
enableProdMode();

Este era mi código, así que recibí el mismo error. Acabo de intercambiar las líneas 3 y 4. Luego se solucionó el problema . Entonces, antes del módulo de arranque, debemos habilitar el modo --prod.

El correcto se puede poner de esta manera,

enableProdMode()
platformBrowserDynamic().bootstrapModule(AppModule);
KUMAR PROFUNDO
fuente
1
Curiosamente, mi nueva aplicación Angular 9 parece haber puesto estas líneas (¡en este orden!) En mi archivo "main.ts". Parece ser el valor predeterminado ahora.
Mike Gledhill
1

Debe tener cuidado de verificar el valor de retorno de la isDevMode()función.

Mi configuración fallaba porque estaba comprobando la existencia: if (isDevMode)siempre true, incluso en producción porque lo declaraba con import { isDevMode } from '@angular/core';.

if (isDevMode())devuelto falsecorrectamente

Spikolynn
fuente
intenta construir tu aplicación con ng build --prod=truecli angular
Sathish Kumar kk
if ( isDevMode )solo comprueba si el identificador isDevMode está definido, no es nulo y no está vacío ni cero. Como el identificador se definió en @angular/coreque if () siempre devolverá verdadero . Ahora, en if( isDevMode() )realidad llamará a la función y regresará si es un entorno de desarrollo o no.
WPomier
1

Simplemente verifique la variable de producción presente en el archivo de entorno, será verdadera para el modo de producción y falsa para el desarrollo.

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

if (environment.production) {
  // for production
} else {
  // for development
}
Jasmeet Singh
fuente