Cách kiểm tra nếu ứng dụng Angular chạy trong chế độ Sản xuất hoặc Phát triển


131

Đây có vẻ là một điều dễ dàng, nhưng tôi không thể tìm thấy bất kỳ giải pháp.

Vậy, làm cách nào để kiểm tra xem ứng dụng của tôi đang chạy ở chế độ sản xuất hay chế độ dev?

Câu trả lời:


198

Bạn có thể sử dụng chức năng này làDevMode

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

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

Một lưu ý : hãy cẩn thận với chức năng này

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

Bạn sẽ nhận được

Lỗi: Không thể bật chế độ prod sau khi thiết lập nền tảng

Sự lựa chọn khác

biến môi trường

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

if (environment.production) {
  //
}

được chèn bởi biến webpack process.env.NODE_ENV

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

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

Tôi đang nhận được cùng một lỗi bạn đã đề cập. "Không thể kích hoạt chế độ prod sau khi thiết lập nền tảng". Bạn có thể vui lòng giúp tôi giải quyết vấn đề này? @yurzui
Gowtham

@Gowtham Bạn phải kích hoạt nó trước khi gọiplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui

Đó chính xác là cách tôi gọi nó. Tôi vẫn gặp lỗi này mỗi lần tôi thử chạy ứng dụng ở chế độ sản xuất @yurzui. Bất kỳ trợ giúp giải quyết điều này sẽ được nhiều đánh giá cao. Cảm ơn
Gowtham

@Gowtham Bạn có ví dụ nào để tái tạo nó không?
yurzui

2
angular.io/api/core/isDevMode "Sau khi được gọi một lần, giá trị sẽ bị khóa và sẽ không thay đổi nữa." Câu trả lời nên bao gồm tài liệu và cảnh báo này!
jasie

38

Theo hướng dẫn Triển khai góc tại https://angular.io/guide/deployment#enable-production-mode :

Xây dựng để sản xuất (hoặc gắn thêm cờ --en môi trường = prod) cho phép chế độ sản xuất Nhìn vào CLI được tạo main.tsđể xem cách thức hoạt động của nó.

main.ts có những điều sau đây

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

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

Vì vậy, kiểm tra environment.productionđể xem nếu bạn đang sản xuất.

Nhiều khả năng bạn KHÔNG muốn gọi isDevMode(). Theo tài liệu API góc tại https://angular.io/api/core/isDevMode :

Sau khi được gọi một lần, giá trị sẽ bị khóa và sẽ không thay đổi nữa ... Theo mặc định, điều này là đúng, trừ khi người dùng gọi enableProdMode trước khi gọi điều này.

Tôi thấy rằng việc gọi isDevMode()từ bản ng build --proddựng luôn trả về đúng và luôn khóa bạn khi chạy ở chế độ dev. Thay vào đó, hãy kiểm tra environment.productionxem bạn có đang sản xuất không. Sau đó, bạn sẽ ở trong chế độ sản xuất.


2
Đây phải là câu trả lời được chấp nhận. (Liên kết tài liệu và giải thích phù hợp.)
jasie

1
Thực tế là giá trị sẽ không thay đổi không có nghĩa là bạn không muốn gọi nó. Bạn không nên chuyển từ chế độ dev sang chế độ prod và quay lại trong khi ứng dụng của bạn đang chạy. Vì vậy, khi bạn đang cố gắng xác định xem bạn có nên bật chế độ sản xuất hay không, biến môi trường là cách phù hợp, nhưng nếu bạn có một dịch vụ cần hành xử khác đi một chút khi ở chế độ dev, thì đó isDevMode()là một cách hoàn toàn tốt để thực hiện cái đó.
StriplingWar Warrior

4

nó phụ thuộc vào những gì bạn đang hỏi ...

Nếu bạn muốn biết modevề Angular, như @yurzui đã nói, bạn cần gọi { isDevMode } from @angular/corenhưng nó chỉ có thể quay lại falsenếu bạn gọi enableProdModetrước nó.

Nếu bạn muốn biết môi trường xây dựng , nói cách khác, nếu ứng dụng của bạn có chạy tối thiểu hóa hay không, bạn cần đặt biến xây dựng trong hệ thống xây dựng của mình ... WebpackChẳng hạn, bạn nên xem qua definePlugin.

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

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

Tôi đã thực sự tìm kiếm cả hai. Tôi đang sử dụng webpack (thông qua angular-cli), tôi phải thêm dòng mã của mình vào đâu? Làm thế nào để tôi có quyền truy cập vào biến đó trong các tệp bản thảo của mình? Tôi sẽ rất tuyệt nếu bạn có thể cập nhật câu trả lời của mình với điều đó
maxbellec

Theo ngcli.github.io/#getting-started-project-structure này, bạn nên chỉnh sửa webpack.config.js sau đó theo liên kết trong câu trả lời của tôi ...
Hitmands

Liên kết trong bài đăng của bạn đã lỗi thời, đây là liên kết chính xác cho Plugin Xác định
HostMyBus

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


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

Đây là mã của tôi, vì vậy tôi đã nhận được cùng một lỗi. Tôi chỉ thay thế dòng 3 và 4. Sau đó, vấn đề đã được khắc phục . Vì vậy, trước khi mô-đun bootstrapping chúng ta nên kích hoạt chế độ --prod.

Một cách chính xác có thể được đặt theo cách này,

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

1
Thật thú vị, ứng dụng Angular 9 mới của tôi dường như đã đưa những dòng này (theo thứ tự này!) Vào tệp "main.ts" của tôi. Nó dường như là mặc định bây giờ.
Mike Gledhill

1

Bạn nên cẩn thận rằng bạn kiểm tra giá trị trả về của isDevMode()hàm.

Thiết lập của tôi đã thất bại bởi vì tôi đang kiểm tra sự tồn tại: if (isDevMode)luôn luôn true, ngay cả trong sản xuất vì tôi đã tuyên bố nó với import { isDevMode } from '@angular/core';.

if (isDevMode())trả lại falsechính xác.


hãy thử xây dựng ứng dụng cho bạn ng build --prod=truethông qua cli góc
Sathish Kumar kk

if ( isDevMode )chỉ kiểm tra nếu định danh isDevMode được xác định, không null và không trống cũng không bằng không. Vì định danh được định nghĩa trong @angular/coređó if () sẽ luôn trả về true . Bây giờ, if( isDevMode() )sẽ thực sự gọi hàm và nó sẽ trả về nếu đó là môi trường phát triển hay không.
WPomier

1

Chỉ cần kiểm tra biến sản xuất có trong tệp môi trường, nó sẽ đúng với chế độ sản xuất và sai cho phát triển.

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

if (environment.production) {
  // for production
} else {
  // for development
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.