在JavaScript项目中将NODE_ENV与多个环境一起使用

sea*_*n11 7 javascript environment-variables node.js express

我处理许多在Express服务器上运行的项目,无论它们是前端(即React.js)代码库还是服务器端Node.js codebases.

很多时候,codebases我会根据前端加载条件配置NODE_ENV,例如前端发出请求的restful API的URL.

我多次使用NODE_ENV有条件地加载服务器端Node.js项目的数据库配置等内容.

在一个由开发,登台和生产(3个环境)组成的项目中,我通常会设置我的代码,以根据NODE_ENV被设置为这3个环境中的任何一个(也可能是"本地")来加载配置.

我最近正在开发一个将生产环境称为"实时"的项目.

当我决定为这种环境设置NODE_ENV = live时,同事指出了这种方法的一个主要缺陷.

似乎Express和其他一些Node.js库可以解决这样一个问题:你将使用"生产"或"开发",因为你NODE_ENV的环境使用其他名称会产生意想不到的影响.

例如,Express需要NODE_ENV=production以"生产"模式运行.根据Express文档"测试表明,这样做可以将应用程序性能提高三倍!"

基本上,我很好奇是否通常将NODE_ENV"开发"和"生产"之类的值设置为"我的项目".

我觉得,如果我要将我的代码部署到云上的开发或登台环境,我认为它们不应该以与生产环境不同的Express"模式"运行.

保持配置分开是否更有意义NODE_ENV

例如,基于类似的变量来构建配置是否有意义APP_ENV,同时确保类似Express的NODE_ENV"开发"或"生产" frameworks/packages.

Din*_*yan 12

NODE_ENV应设置为传统意义上的任一developmentproduction

原因是,当您构建前端应用程序(React 等)时,您要么以development模式构建应用程序,要么以模式构建应用程序production。例如,在development模式中,您将观察变化并持续构建。在生产模式下,您可以缩小代码并优化其大小。

在节点服务器的情况下,NODE_ENV指的是您启动应用程序的模式。例如,在development模式下,您配置服务器并安装所有devDependencies并监视更改并实时重新加载服务器。在production模式下,您只需安装dependencies和启动优化配置的服务器。

现在谈论不同的生产环境,比如stagingpre-livelive,等,你应该使用一个单独的ENV变量这一点。除了local,所有其他环境都被视为production环境,您的应用程序应该production在这些环境中构建并以模式启动。

您通常会加载不同的配置,比如每个环境的 api 密钥、url。这些应该用一个单独的 ENV 变量来区分,比如APP_ENV.

我通常APP_ENV用来区分staginglive环境。

这是package.json不同环境下不同启动脚本的样子

"scripts": {
  "start:local": "NODE_ENV=development APP_ENV=local your-start-script",
  "start:staging": "NODE_ENV=production APP_ENV=staging your-start-script",
  "start:live": "NODE_ENV=production APP_ENV=live your-start-script",
}
Run Code Online (Sandbox Code Playgroud)

您需要在每个环境中使用正确的启动脚本启动应用程序。


Mob*_*ius 7

NODE_ENV用于区分开发和生产实例.没有运行生产代码不是一个好主意NODE_ENV=production.NODE_ENV=development通常不那么重要,因为图书馆通常只是检查是否NODE_ENV !== 'production'.因此,如果您希望拥有多个生产节点环境或类似生产环境,则应设置每个环境NODE_ENV=production.也就是说,您可以将其他环境变量设置为您想要的任何值,并在运行时从节点读取它们.

一个合理的例子是拥有配置的版本local stagingproduction版本.在这种情况下,我建议NODE_ENV您只为每个环境设置一个参数.例如,您可能要三个不同的数据库,为每个local,stagingproduction而是设置NODE_ENVdevelopmentlocal,和production两个stagingproduction.

由于变量将是shell变量,因此在运行服务器之前,您需要一种在目标操作系统上加载某些环境变量的方法.像https://www.npmjs.com/package/dotenv这样的模块看起来很有希望.

  • 答案很好。我仍然无法相信整个(流行的)库都是围绕您的配置将从NODE_ENV https://github.com/lorenwest/node-config加载的想法建立的。我敢肯定,使用这种库的许多人会将他们的NODE_ENV设置为“ development”或“ production”以外的值,以适应特定于环境的配置并且不了解其含义。 (2认同)