Como verificar se o aplicativo Angular está sendo executado no modo de produção ou desenvolvimento

131

Parece fácil, mas não consegui encontrar nenhuma solução.

Então, como verifico se meu aplicativo está sendo executado no modo de produção ou no modo dev?

maxbellec
fonte

Respostas:

198

Você pode usar esta função isDevMode

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

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

Uma observação : tenha cuidado com esta função

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

Você vai ter

Erro: não é possível ativar o modo prod após a configuração da plataforma

Outras opções

variável de ambiente

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

if (environment.production) {
  //
}

injetado pela variável webpack process.env.NODE_ENV

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

if (env  === 'production') {
  //
}
yurzui
fonte
Estou recebendo o mesmo erro que você mencionou. "Não é possível ativar o modo de produção após a configuração da plataforma". Você poderia me ajudar a resolver isso? @yurzui
Gowtham 27/03
@Gowtham Você precisa habilitá-lo antes de ligar #platformBrowserDynamic().bootstrapModule(AppModule);
yurzui 27/03
É exatamente assim que estou chamando. Ainda estou recebendo esse erro toda vez que tento executar o aplicativo no modo de produção @yurzui. Qualquer ajuda para resolver isso seria muito apreciada. Graças
Gowtham
@Gowtham Você tem algum exemplo para reproduzi-lo?
yurzui
2
angular.io/api/core/isDevMode "Depois de chamado uma vez, o valor está bloqueado e não muda mais." A resposta deve incluir o documento e este aviso!
Jasie
38

De acordo com o guia Angular Deployment em https://angular.io/guide/deployment#enable-production-mode :

Construir para produção (ou anexar o sinalizador --environment = prod) ativa o modo de produção Observe a CLI gerada main.tspara ver como isso funciona.

main.ts tem o seguinte:

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

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

Portanto, verifique environment.productionse você está em produção.

Provavelmente você NÃO deseja ligar isDevMode(). De acordo com a documentação da API Angular em https://angular.io/api/core/isDevMode :

Depois de chamado uma vez, o valor fica bloqueado e não muda mais ... Por padrão, isso é verdade, a menos que um usuário chame enableProdMode antes de chamar isso.

Descobri que a chamada isDevMode()de uma ng build --prodcompilação sempre retorna true e sempre o impede de executar no modo dev. Em vez disso, verifique environment.productionse você está em produção. Então você permanecerá no modo de produção.

Ron DeSantis
fonte
2
Essa deve ser a resposta aceita. (Doc adequada ligando e explicações.)
Jasie
1
O fato de o valor não mudar não implica que você não queira chamá-lo. Você não deve alternar do modo dev para o modo prod e voltar enquanto o aplicativo estiver em execução. Portanto, quando você está tentando determinar se deve ativar o modo de produção, a variável de ambiente é o caminho certo a seguir, mas se você tem um serviço que precisa se comportar de maneira um pouco diferente no modo dev, isDevMode()é uma maneira perfeitamente adequada de realizar aquele.
StriplingWarrior
4

depende do que você está perguntando ...

Se você quiser conhecer o modeAngular, como @yurzui disse, é necessário ligar, { isDevMode } from @angular/coremas ele falsesó poderá retornar se você ligar enableProdModeantes.

Se você deseja conhecer o ambiente de compilação , em outras palavras, se seu aplicativo está sendo minificado ou não, você precisa definir uma variável de compilação no seu sistema de compilação ... Usando Webpack, por exemplo, você deve dar uma olhada definePlugin.

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

new webpack.DefinePlugin({
  ENV_PRODUCTION: !!process.env.NODE_ENV
});
Hitmands
fonte
Na verdade, eu estava procurando por ambos. Estou usando o webpack (através do angular-cli), onde adiciono suas linhas de código? Como tenho acesso a essa variável nos meus arquivos datilografados? Eu seria ótimo se você pudesse atualizar a sua resposta com que
maxbellec
Seguindo essa ngcli.github.io/#getting-started-project-structure você deve editar os webpack.config.js siga o link na minha resposta ...
Hitmands
O link no seu post está desatualizado, heres o correto para a Definir Plugin
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 o meu código, então recebi o mesmo erro. Troquei as linhas 3 e 4. Em seguida, o problema foi resolvido . Portanto, antes do módulo de inicialização, devemos ativar o modo --prod.

O correto pode ser colocado dessa maneira,

enableProdMode()
platformBrowserDynamic().bootstrapModule(AppModule);
KUMAR PROFUNDO
fonte
1
Curiosamente, meu novo aplicativo Angular 9 parece ter colocado essas linhas (nessa ordem!) No meu arquivo "main.ts". Parece ser o padrão agora.
Mike Gledhill
1

Você deve ter cuidado para verificar o valor de retorno da isDevMode()função.

Minha configuração estava falhando porque eu estava verificando a existência: if (isDevMode)estava sempre true, mesmo em produção, porque eu a declarei import { isDevMode } from '@angular/core';.

if (isDevMode())retornou falsecorretamente.

Spikolynn
fonte
tente construir seu aplicativo com ng build --prod=truevia angular CLI
Sathish Kumar kk 10/10
if ( isDevMode )verifica apenas se o identificador isDevMode está definido, não é nulo e não está vazio nem é zero. Como o identificador foi definido em @angular/coreque se () sempre retornará verdadeiro . Agora, if( isDevMode() )realmente chamará a função e retornará se for um ambiente de desenvolvimento ou não.
WPomier 30/01
1

Basta verificar a variável de produção presente no arquivo de ambiente, será verdadeira para o modo de produção e falsa para o desenvolvimento.

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

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