วิธีตรวจสอบว่าแอปพลิเคชันเชิงมุมทำงานในโหมดการผลิตหรือการพัฒนาหรือไม่


132

ดูเหมือนจะง่าย แต่ฉันไม่พบวิธีแก้ปัญหาใด ๆ

ดังนั้นฉันจะตรวจสอบได้อย่างไรว่าแอปของฉันกำลังทำงานในโหมดการผลิตหรือโหมดการพัฒนา

คำตอบ:


200

คุณสามารถใช้ฟังก์ชันนี้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 ตัวแปร env.NODE_ENV

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

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

ฉันได้รับข้อผิดพลาดเดียวกันกับที่คุณพูดถึง "ไม่สามารถเปิดใช้งานโหมด prod หลังจากการตั้งค่าแพลตฟอร์ม" คุณช่วยฉันแก้ไขปัญหานี้ได้ไหม @yurzui
Gowtham

@Gowtham คุณต้องเปิดใช้งานก่อนที่จะโทรplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui

นั่นคือวิธีที่ฉันเรียกมัน ฉันยังคงได้รับข้อผิดพลาดนี้ทุกครั้งที่พยายามเรียกใช้แอปในโหมดการผลิตที่ @yurzui ความช่วยเหลือใด ๆ ในการแก้ไขปัญหานี้จะได้รับการชื่นชมมาก ขอบคุณ
Gowtham

@ คุณโกวทามมีตัวอย่างที่จะทำซ้ำไหม?
yurzui

2
angular.io/api/core/isDevMode "หลังจากเรียกครั้งเดียวค่าจะถูกล็อกและจะไม่เปลี่ยนแปลงอีกต่อไป" คำตอบควรมีเอกสารและคำเตือนนี้ด้วย!
jasie

39

ตามคู่มือการปรับใช้เชิงมุมที่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บิลด์จะคืนค่าจริงเสมอและล็อกให้คุณทำงานในโหมด dev ให้ตรวจสอบenvironment.productionดูว่าคุณอยู่ระหว่างการผลิตหรือไม่ จากนั้นคุณจะอยู่ในโหมดการผลิต


2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ (การเชื่อมโยงเอกสารและคำอธิบายที่เหมาะสม)
เจซี่

1
ความจริงที่ว่าค่าจะไม่เปลี่ยนแปลงไม่ได้หมายความว่าคุณไม่ต้องการเรียกมัน คุณไม่ควรเปลี่ยนจากโหมด dev เป็นโหมด prod และย้อนกลับในขณะที่แอปพลิเคชันของคุณกำลังทำงานอยู่ ดังนั้นเมื่อคุณพยายามกำหนดว่าคุณควรเปิดใช้งานโหมดการผลิตหรือไม่ตัวแปรสภาพแวดล้อมเป็นวิธีที่ถูกต้อง แต่ถ้าคุณมีบริการที่ต้องทำงานแตกต่างกันเล็กน้อยเมื่ออยู่ในโหมดพัฒนาisDevMode()เป็นวิธีที่ดีอย่างยิ่งในการทำให้สำเร็จ ที่.
StriplingWarrior

4

ขึ้นอยู่กับสิ่งที่คุณกำลังขอ ...

หากคุณต้องการทราบmodeAngular ตามที่ @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) ฉันจะเพิ่มบรรทัดโค้ดของคุณได้ที่ไหน ฉันจะเข้าถึงตัวแปรนั้นในไฟล์ typescript ได้อย่างไร ฉันจะดีมากถ้าคุณสามารถอัปเดตคำตอบของคุณได้
maxbellec

ตามนี้ngcli.github.io/#getting-started-project-structureคุณควรแก้ไข webpack.config.js จากนั้นไปที่ลิงค์ในคำตอบของฉัน ...
Hitmands

ลิงก์ในโพสต์ของคุณล้าสมัยนี่เป็นลิงก์ที่ถูกต้องสำหรับDefine Plugin
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" ของฉันแล้ว ตอนนี้ดูเหมือนจะเป็นค่าเริ่มต้น
Mike Gledhill

1

คุณควรระมัดระวังให้คุณตรวจสอบค่าส่งคืนของไฟล์ isDevMode()ฟังก์ชัน

การตั้งค่าของฉันล้มเหลวเนื่องจากฉันกำลังตรวจสอบการมีอยู่: if (isDevMode)อยู่เสมอtrueแม้ในการผลิตเพราะฉันประกาศด้วยimport { isDevMode } from '@angular/core';แม้ในการผลิตเพราะผมประกาศด้วย

if (isDevMode())ส่งคืนfalseอย่างถูกต้อง


ลองสร้างแอปของคุณด้วยng build --prod=trueangular cli
Sathish Kumar kk

if ( isDevMode )ตรวจสอบเฉพาะว่าตัวระบุisDevModeถูกกำหนดไม่ใช่ null และไม่ว่างหรือเป็นศูนย์ ในฐานะที่เป็นตัวบ่งชี้ที่ถูกกำหนดไว้ใน@angular/coreที่ถ้า ()มักจะกลับจริง ตอนนี้if( isDevMode() )จะเรียกใช้ฟังก์ชันจริงและจะกลับมาว่าเป็นสภาพแวดล้อมการพัฒนาหรือไม่
WPomier

1

เพียงตรวจสอบตัวแปรการผลิตที่มีอยู่ในไฟล์สภาพแวดล้อมซึ่งจะเป็นจริงสำหรับโหมดการผลิตและเป็นเท็จสำหรับการพัฒนา

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

if (environment.production) {
  // for production
} else {
  // for development
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.