Jak sprawdzić, czy aplikacja Angular działa w trybie produkcyjnym lub programistycznym


131

Wydaje się to łatwe, ale nie mogłem znaleźć żadnego rozwiązania.

Jak więc sprawdzić, czy moja aplikacja działa w trybie produkcyjnym czy deweloperskim?

Odpowiedzi:


198

Możesz użyć tej funkcji jest DevMode

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

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

Jedna uwaga : zachowaj ostrożność podczas korzystania z tej funkcji

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

Dostaniesz

Błąd: nie można włączyć trybu produkcyjnego po konfiguracji platformy

Inne opcje

Zmienna środowiskowa

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

if (environment.production) {
  //
}

wstrzyknięta przez webpack zmienna process.env.NODE_ENV

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

if (env  === 'production') {
  //
}

Otrzymuję ten sam błąd, o którym wspomniałeś. „Nie można włączyć trybu produkcyjnego po konfiguracji platformy”. Czy mógłbyś mi pomóc w rozwiązaniu tego problemu? @yurzui
Gowtham

@Gowtham Musisz to włączyć, zanim zadzwoniszplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui

Dokładnie tak to nazywam. Nadal pojawia się ten błąd za każdym razem, gdy próbuję uruchomić aplikację w trybie produkcyjnym @yurzui. Każda pomoc w rozwiązaniu tego problemu byłaby bardzo mile widziana. Dzięki
Gowtham

@Gowtham Czy masz jakiś przykład, aby go odtworzyć?
yurzui

2
angular.io/api/core/isDevMode "Po wywołaniu wartość jest zablokowana i już się nie zmieni." Odpowiedź powinna zawierać dokument i to ostrzeżenie!
jasie,

38

Zgodnie z przewodnikiem po Angular Deployment pod adresem https://angular.io/guide/deployment#enable-production-mode :

Tworzenie do celów produkcyjnych (lub dołączanie flagi --environment = prod) włącza tryb produkcyjny Spójrz na wygenerowany przez CLI, main.tsaby zobaczyć, jak to działa.

main.ts ma następujące cechy:

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

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

Więc sprawdź environment.production czy jesteś w produkcji.

Najprawdopodobniej NIE chcesz dzwonić isDevMode(). Zgodnie z dokumentacją Angular API na https://angular.io/api/core/isDevMode :

Po jednokrotnym wywołaniu wartość jest blokowana i już się nie zmieni ... Domyślnie jest to prawda, chyba że użytkownik wywoła metodę enableProdMode przed wywołaniem tego.

Odkryłem, że wywołanie isDevMode()z ng build --prodkompilacji zawsze zwraca prawdę i zawsze blokuje działanie w trybie deweloperskim. Zamiast tego sprawdź, environment.productionczy jesteś w produkcji. Następnie pozostaniesz w trybie produkcyjnym.


2
To powinna być akceptowana odpowiedź. (Właściwe linki do dokumentów i wyjaśnienia.)
jasie

1
Fakt, że wartość się nie zmieni, nie oznacza, że ​​nie chcesz tego nazywać. Nie powinieneś przełączać się z trybu deweloperskiego na tryb produkcyjny iz powrotem, gdy aplikacja jest uruchomiona. Więc kiedy próbujesz określić, czy powinieneś włączyć tryb produkcyjny, zmienna środowiskowa jest właściwą drogą, ale jeśli masz usługę, która musi zachowywać się nieco inaczej w trybie deweloperskim, isDevMode()jest to doskonały sposób na osiągnięcie że.
StriplingWarrior

4

to zależy od tego, o co prosisz ...

Jeśli chcesz poznać modeAngular, jak powiedział @yurzui, musisz zadzwonić, { isDevMode } from @angular/coreale może wrócić falsetylko wtedy, gdy zadzwonisz enableProdModewcześniej.

Jeśli chcesz poznać środowisko kompilacji , innymi słowy, czy Twoja aplikacja działa w wersji zminimalizowanej, czy nie, musisz ustawić zmienną kompilacji w swoim systemie kompilacji ... Używając Webpackna przykład, powinieneś rzucić okiem definePlugin.

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

new webpack.DefinePlugin({
  ENV_PRODUCTION: !!process.env.NODE_ENV
});

Właściwie szukałem obu. Używam webpacka (poprzez angular-cli), gdzie mam dodać twoje wiersze kodu? Jak mogę uzyskać dostęp do tej zmiennej w moich plikach maszynopisu? Byłoby wspaniale, gdybyś mógł zaktualizować swoją odpowiedź o to
maxbellec

Po tej ngcli.github.io/#getting-started-project-structure powinieneś edytować plik webpack.config.js, a następnie kliknąć link w mojej odpowiedzi ...
Hitmands

Link w twoim poście jest nieaktualny, oto poprawny dla wtyczki Define
HostMyBus

2
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
import { enableProdMode } from '@angular/core';
import { AppModule } from './app.module'


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

To był mój kod, więc mam ten sam błąd. Właśnie zamieniłem linię 3 i 4. Wtedy problem został rozwiązany . Dlatego przed uruchomieniem modułu powinniśmy włączyć tryb --prod.

Właściwy można umieścić w ten sposób,

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

1
Co ciekawe, wydaje się, że moja nowa aplikacja Angular 9 już umieściła te wiersze (w tej kolejności!) W moim pliku „main.ts”. Wydaje się, że teraz jest to ustawienie domyślne.
Mike Gledhill

1

Należy uważać, aby sprawdzić wartość zwracaną przez isDevMode()funkcję.

Moja konfiguracja nie powiodła się, ponieważ sprawdzałem istnienie: if (isDevMode)była zawsze true, nawet w środowisku produkcyjnym, ponieważ zadeklarowałem to za pomocą import { isDevMode } from '@angular/core';.

if (isDevMode())zwrócone falsepoprawnie.


spróbuj zbudować swoją aplikację z ng build --prod=truevia angular cli
Sathish Kumar kk

if ( isDevMode )sprawdza tylko, czy zdefiniowano identyfikator isDevMode , a nie null, pusty ani zero. Ponieważ identyfikator został zdefiniowany @angular/core, if () zawsze będzie zwracać true . Teraz if( isDevMode() )faktycznie wywoła funkcję i zwróci, jeśli jest to środowisko programistyczne, czy nie.
WPomier

1

Po prostu sprawdź zmienną produkcyjną obecną w pliku środowiskowym, będzie ona prawdziwa dla trybu produkcyjnego i fałszywa dla programowania.

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

if (environment.production) {
  // for production
} else {
  // for development
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.