如何检查Angular应用程序运行在生产模式还是开发模式

210

这似乎是一个简单的问题,但我找不到任何解决方案。

那么,我如何检查我的应用程序正在运行的是否为生产模式或开发模式?

7个回答

320

您可以使用此函数 isDevMode

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

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

一个注意事项: 在使用这个函数时要小心

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

您将会得到:

Error: Cannot enable prod mode after platform setup

其他选项

环境变量

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

我遇到了你提到的同样的错误:“Cannot enable prod mode after platform setup”。你能帮我解决一下吗?@yurzui - Gowtham
@Gowtham 在调用 platformBrowserDynamic().bootstrapModule(AppModule); 之前,你需要先启用它。 - yurzui
这正是我所调用的方式。但每次尝试在生产模式下运行应用程序时,我仍然会遇到这个错误@yurzui。希望能得到任何解决此问题的帮助。谢谢。 - Gowtham
2
https://angular.cn/api/core/isDevMode "调用一次后,该值将被锁定,不再更改。" 答案应包括文档和此警告! - jasie
为了提高控制台日志的可读性,在要记录的布尔结果前添加一些消息。否则,您只会在控制台中看到 true 或 false,这可能来自任何地方。示例: console.log("Angular 处于开发模式:" + isDevMode()); - Michael
显示剩余4条评论

62
根据 https://angular.io/guide/deployment#enable-production-mode 上的 Angular 部署指南:
构建生产环境(或附加 --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

调用一次后,该值将被锁定并且不会再更改... 默认情况下,这是true,除非用户在调用此函数之前调用enableProdMode。

我发现从ng build --prod构建中调用isDevMode()总是返回true,并始终将您锁定为运行在开发模式下。 相反,请检查environment.production以查看您是否处于生产环境。 然后您将保持在生产模式下。


3
这应该是被接受的答案。(适当的文档链接和解释。) - jasie
5
数值不改变并不意味着你不需要调用它。在应用程序运行时,您不应该在开发模式和生产模式之间切换。因此,在尝试确定是否应启用生产模式时,环境变量是正确的选择,但如果您有一个需要在开发模式下表现出略微不同行为的服务,则 isDevMode() 是完全可以胜任的。 - StriplingWarrior
我不认为这仍然有效。新的Angular版本甚至不会自动生成一个env文件,如果你通过schematics生成它,也不会有一个production属性。 - undefined

10

只需检查环境文件中的 production 变量,它在生产模式下为 true,在开发模式下为 false。

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

if (environment.production) {
  // for production
} else {
  // for development
}

6

这要看你在问什么...

如果你想知道 Angular 的模式,正如 @yurzui 所说,你需要调用 { isDevMode } from @angular/core。但是只有在调用 enableProdMode 之前,它才可能返回 false

如果你想知道构建环境,换句话说,你的应用程序是否在缩小运行,你需要在构建系统中设置一个构建变量...例如,使用 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
根据http://ngcli.github.io/#getting-started-project-structure,您应该编辑webpack.config.js,然后按照我的答案中的链接操作... - Hitmands
你的帖子中的链接已过期,这是Define Plugin的正确链接。 - HostMyBus

4
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

尝试使用Angular CLI通过ng build --prod=true构建您的应用程序。 - Sathish Kumar k k
1
if ( isDevMode )只是检查标识符 isDevMode 是否被定义、不为null、不为空且不为零。由于该标识符在 @angular/core 中被定义,因此if() 语句将始终返回 true。现在,if ( isDevMode() )实际上会调用该函数,并且它将返回是否处于开发环境。 - Wilfredo Pomier

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

export const environment = {  
  apiURL: (env  === 'production') 
    ? 'https://example.com/api'
    : 'http://localhost:8080/api'
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接