Angularアプリケーションがプロダクションモードまたは開発モードで実行されているかどうかを確認する方法


131

これは簡単なことのようですが、解決策は見つかりませんでした。

では、アプリがプロダクションモードと開発モードのどちらで実行されているかを確認するにはどうすればよいですか?

回答:


198

この関数を使用できますisDevMode

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

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

注意:この関数注意してください

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

あなたが得るでしょう

エラー:プラットフォームのセットアップ後に製品モードを有効にできません

別のオプション

環境変数

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') {
  //
}

あなたが言及したのと同じエラーが発生します。「プラットフォームのセットアップ後に製品モードを有効にできません」。これを解決するのを手伝ってくれませんか?@yurzui
Gowtham

@Gowtham呼び出す前に有効にする必要がありますplatformBrowserDynamic().bootstrapModule(AppModule);
yurzui

それがまさに私がそれを呼んでいる方法です。それでも、アプリをプロダクションモード@yurzuiで実行しようとするたびに、このエラーが発生します。これを解決するための助けがあれば大歓迎です。ありがとう
Gowtham 2017年

@Gowtham再現する例はありますか?
yurzui 2017年

2
angular.io/api/core/isDevMode「一度呼び出された後、値はロックされ、それ以上変更されません。」回答にはドキュメントとこの警告を含める必要があります!
ジェシー

38

https://angular.io/guide/deployment#enable-production-modeの Angular Deploymentガイドによると:

本番用にビルドする(または--environment = prodフラグを追加する)と、本番モードが有効になります。CLIが生成したものmain.tsを見て、これがどのように機能するかを確認してください。

main.ts 次のものがあります。

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

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

したがってenvironment.production、本番環境にあるかどうかを確認してください。

おそらくあなたは電話したくないでしょうisDevMode()https://angular.io/api/core/isDevModeにあるAngular APIドキュメントに従って

一度呼び出されると、値はロックされ、それ以上変更されません...ユーザーがこれを呼び出す前にenableProdModeを呼び出さない限り、デフォルトではこれはtrueです。

ビルドisDevMode()からの呼び出しはng build --prod常にtrueを返し、常に開発者モードでの実行にロックされることがわかりました。代わりに、実際environment.productionに稼働しているかどうかを確認してください。その後、プロダクションモードのままになります。


2
これは受け入れられる答えになるはずです。(適切なドキュメントのリンクと説明。)
jasie

1
値が変化しないという事実は、それを呼び出したくないことを意味するものではありません。アプリケーションの実行中に、devモードからprodモードに切り替えたり、元に戻したりしないでください。したがって、本番モードを有効にする必要があるかどうかを判断しようとしている場合、環境変数は適切な方法ですが、開発モードのときに少し異なる動作が必要なサービスがある場合、これisDevMode()は完全に優れた方法です。それ。
StriplingWarrior

4

それはあなたが何を求めているかによる...

mode@yurzuiが言ったように、Angularのを知りたい場合は、呼び出す必要があります{ 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
});

私は実際に両方を探していました。(angular-cliを介して)webpackを使用していますが、コード行をどこに追加しますか?typescriptファイルでその変数にアクセスするにはどうすればよいですか?
それで

この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)常にでした。trueimport { isDevMode } from '@angular/core';

if (isDevMode())false正しく戻りました。


ng build --prod=true
Angular CLI

if ( isDevMode )識別子isDevModeが定義されているかどうか、nullではなく、空でもゼロでもないかどうかだけをチェックします。その中で識別子が定義された@angular/coreので、if()は常にtrueを返します。これで、if( isDevMode() )実際に関数が呼び出され、開発環境かどうかにかかわらず戻ります。
WPomier

1

環境ファイルに存在する製品変数を確認するだけで、製品モードではtrueになり、開発ではfalseになります。

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

if (environment.production) {
  // for production
} else {
  // for development
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.