Skip to content

Node.js 开发环境与生产环境的区别

Node.js 的开发环境和生产环境没有区别,也就是说,不需要进行任何特定设置来使 Node.js 在生产环境中工作。但是,npm 注册表中的一些库会识别 NODE_ENV 变量,并将其默认设置为 development。始终使用 NODE_ENV=production 设置运行 Node.js。

一种流行的应用程序配置方式是使用 十二要素方法

Express 中的 NODE_ENV

在广受欢迎的 express 框架中,将 NODE_ENV 设置为 production 通常可以确保:

  • 日志记录保持在最低限度,即必要的级别
  • 更多的缓存级别以优化性能

这通常通过执行命令

bash
export NODE_ENV=production

在 shell 中完成,但最好将其放在 shell 配置文件(例如,使用 Bash shell 的 .bash_profile)中,因为否则在系统重启的情况下该设置不会持久化。

您也可以通过在应用程序初始化命令前添加环境变量来应用它:

bash
NODE_ENV=production node app.js

例如,在一个 Express 应用程序中,您可以使用它为每个环境设置不同的错误处理程序:

javascript
if (process.env.NODE_ENV === 'development') {
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
  app.use(express.errorHandler());
}

例如 PugExpress.js 使用的模板引擎,如果 NODE_ENV 未设置为 production,则会在调试模式下编译。在开发模式下,Express 视图在每次请求中都会编译,而在生产模式下则会被缓存。还有许多其他的例子。

这个环境变量是一个广泛用于外部库的约定,但 Node.js 本身并没有使用。

为什么 NODE_ENV 被认为是一种反模式?

环境是一个数字平台或系统,工程师可以在其中构建、测试、部署和管理软件产品。通常,我们的应用程序运行在四个阶段或类型的环境中:

  • 开发
  • 预发布
  • 生产
  • 测试

NODE_ENV 的根本问题在于开发人员将优化和软件行为与软件运行的环境结合起来。结果产生了如下代码:

javascript
if (process.env.NODE_ENV === 'development') {
  // ...
}
if (process.env.NODE_ENV === 'staging') {
  // ...
}
if (process.env.NODE_ENV === 'production') {
  // ...
}
if (process.env.NODE_ENV === 'testing') {
  // ...
}

虽然这看起来无害,但它使生产和预发布环境不同,从而使可靠测试成为不可能。例如,当 NODE_ENV 设置为 development 时,您的产品的测试以及功能可能会通过,但在将 NODE_ENV 设置为 production 时却失败。因此,将 NODE_ENV 设置为除 production 之外的任何值都被认为是一种反模式。