Як перевірити, чи працює кутовий додаток у режимі виробництва чи розробки


131

Це здається легким, але я не зміг знайти жодного рішення.

Отже, як я можу перевірити, чи працює моя програма у режимі виробництва чи режимі розробки?

Відповіді:


198

Ви можете використовувати цю функцію isDevMode

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

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

Одне зауваження : будьте обережні з цією функцією

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

Ти отримаєш

Помилка: неможливо увімкнути режим prod після встановлення платформи

Інші варіанти

змінна середовище

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

if (environment.production) {
  //
}

вводиться змінною webpack process.env.NODE_ENV

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

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

Я отримую ту саму помилку, яку ви згадали. Msgstr "Неможливо ввімкнути режим prod після установки платформи". Чи можете ви мені допомогти у вирішенні цього питання? @yurzui
Gowtham

@Gowtham Ви повинні ввімкнути це перед тим, як дзвонитиplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui

Саме так я це називаю. Я все-таки отримую цю помилку щоразу, коли намагаюся запустити додаток у виробничому режимі @yurzui. Будь-яка допомога у вирішенні цього буде дуже вдячна. Спасибі
Gowtham

@Gowtham Чи є у вас приклад для відтворення?
юрзуй

2
angular.io/api/core/isDevMode "Після виклику одного разу значення блокується і більше не змінюватиметься." Відповідь повинна містити документа та це попередження!
jasie

38

Згідно з посібником з кутового розгортання за адресою https://angular.io/guide/deployment#enable-production-mode :

Побудова для виробництва (або додавання прапора --environment = prod) дозволяє виробничий режим Подивіться на створений CLI, main.tsщоб побачити, як це працює.

main.ts має наступне:

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

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

Тож перевіряйте environment.production чи є у вас виробництво.

Швидше за все, ви НЕ хочете телефонувати isDevMode(). Відповідно до документації Angular API за адресою https://angular.io/api/core/isDevMode :

Після виклику один раз, значення блокується і більше не змінюватиметься ... За замовчуванням це справедливо, якщо користувач не дзвонить enableProdMode перед тим, як викликати це.

Я виявив, що виклик isDevMode()із ng build --prodскладання завжди повертається істинним і завжди блокує вас працювати в режимі розробки. Натомість перевірте, environment.productionчи є у вас виробництво. Тоді ви залишитесь у виробничому режимі.


2
Це має бути прийнятою відповіддю. (Правильне посилання на документи та пояснення.)
jasie

1
Те, що значення не зміниться, не означає, що ви не хочете його називати. Ви не повинні переходити з режиму розробки на режим продюсування та назад, поки програма працює. Тож, коли ви намагаєтеся визначити, чи слід включати режим виробництва, змінна середовище - це правильний шлях, але якщо у вас є служба, яка повинна поводитись трохи інакше, коли в режимі isDevMode()розробки , це ідеально чудовий спосіб її виконання. що.
StriplingWarrior

4

це залежить від того, про що ви питаєте ...

Якщо ви хочете дізнатися modeпро кутовий, як сказав @yurzui, вам потрібно зателефонувати, { isDevMode } from @angular/coreале він може повернутися, falseлише якщо ви телефонуєтеenableProdMode до нього.

Якщо ви хочете знати середовище збирання , іншими словами, якщо ваш додаток працює в мінімізованому режимі чи ні, вам потрібно встановити змінну збірки у вашій системі збирання ... ВикористанняWebpack , наприклад, ви повинні ознайомитись definePlugin.

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

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

Я насправді шукав обох. Я використовую webpack (через angular-cli), куди я додаю ваші рядки коду? Як я можу отримати доступ до цієї змінної у своїх файлах машинопису? Я був би
здоровий,

Після цього ngcli.github.io/#getting-started-project-structure ви повинні відредагувати webpack.config.js, а потім перейти за посиланням у моїй відповіді ...
Hitmands

Посилання у вашій публікації застаріло, ось правильний для визначення плагін
HostMyBus

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


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

Це був мій код, тому я отримав таку ж помилку. Я просто змінив рядки 3 і 4. Потім питання виправлено . Тому перед модулем завантаження ми повинні включити режим --prod.

Правильний можна поставити таким чином,

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

1
Цікаво те, що, схоже, мій новий додаток Angular 9 вже додав ці рядки (у такому порядку!) У мій файл "main.ts". Здається, зараз це за замовчуванням.
Майк Гледхілл

1

Ви повинні бути обережними, щоб перевірити значення повернення isDevMode()функції.

Моє налаштування не вдалося, тому що я перевіряв наявність: if (isDevMode)був завжди true, навіть у виробництві, тому що я заявив про це import { isDevMode } from '@angular/core';.

if (isDevMode())повернуто falseправильно.


спробуйте створити додаток за ng build --prod=trueдопомогою кутового кліпу
Sathish Kumar kk

if ( isDevMode )перевіряє, чи визначений ідентифікатор isDevMode , не null, не порожній і нульовий. Оскільки ідентифікатор визначено, @angular/coreщо if () завжди поверне true . Тепер, if( isDevMode() )насправді викличе функцію, і вона повернеться, якщо це середовище розробки чи ні.
WPomier

1

Просто перевірте виробничу змінну, що присутня у файлі навколишнього середовища, вона буде істинною для режиму виробництва та помилковою для розробки.

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

if (environment.production) {
  // for production
} else {
  // for development
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.