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

时间:2017-03-01 04:25:21

标签: javascript node.js express environment-variables

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

使用前端codebases多次,我会根据NODE_ENV加载条件配置,例如前端发出请求的restful API的URL。

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

在一个由开发,登台和生产(3个环境)组成的项目中,我通常会设置我的代码来加载基于NODE_ENV被设置为这3个环境中的任何一个的配置(也许也“本地”)。

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

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

Express.js的Express和其他一些库似乎阻止了你将“生产”或“开发”用作NODE_ENV这一事实,并且在你的环境中使用其他名称会产生意想不到的影响。

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

基本上,我很好奇是否将NODE_ENV设置为“开发”和“生产”以外的其他值,这就像我在项目中所做的一样。

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

维护与NODE_ENV分开的配置更有意义吗?

例如,是否有必要根据APP_ENV等变量建立配置,同时确保NODE_ENV为“开发”或“生产” frameworks/packages喜欢Express。

3 个答案:

答案 0 :(得分:7)

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

一个合理的例子是您的配置有local stagingproduction个版本。在这种情况下,我建议NODE_ENV只是您为每个环境设置的参数之一。例如,您可能需要为localstagingproduction分别设置三个不同的数据库,但在NODE_ENV上将development设置为local,并且productionstaging都有production

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

答案 1 :(得分:1)

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",
}

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

答案 2 :(得分:0)

在安装NODE_ENV模块时,可以在多个环境中使用custom-envnpm install custom-env 完整的文档在这里:https://www.npmjs.com/package/custom-env