我处理在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。
答案 0 :(得分:7)
NODE_ENV
用于区分开发和生产实例。在没有NODE_ENV=production
的情况下运行生产代码不是一个好主意。 NODE_ENV=development
通常不那么重要,因为图书馆通常只是检查是否NODE_ENV !== 'production'
。因此,如果您希望拥有多个生产节点环境或类似生产环境,则每个环境都应设置NODE_ENV=production
。也就是说,您可以将其他环境变量设置为您想要的任何值,并在运行时从节点读取它们。
一个合理的例子是您的配置有local
staging
和production
个版本。在这种情况下,我建议NODE_ENV
只是您为每个环境设置的参数之一。例如,您可能需要为local
,staging
和production
分别设置三个不同的数据库,但在NODE_ENV
上将development
设置为local
,并且production
和staging
都有production
。
由于变量将是shell变量,因此在运行服务器之前,您需要一种在目标操作系统上加载某些环境变量的方法。像https://www.npmjs.com/package/dotenv这样的模块看起来很有希望。
答案 1 :(得分:1)
NODE_ENV
应该设置为传统意义上的development
或production
。
原因是,当您构建前端应用程序(React等)时,您将以development
模式或production
模式构建应用程序。例如,在development
模式下,您将监视更改并持续构建。在生产模式下,您可以缩减代码并优化其大小。
对于节点服务器,NODE_ENV
是指您以什么模式启动应用程序。例如,在development
模式下,您配置服务器并安装所有devDependencies
并注意更改并实时重新加载服务器。在production
模式下,您只需安装dependencies
并以优化的配置启动服务器。
现在讨论不同的生产环境,例如staging
,pre-live
,live
等,您应该为此使用一个单独的ENV变量。除local
之外,所有其他环境都被视为production
环境,在这些环境中,您的应用应以production
模式构建并启动。
您通常会为每个环境加载不同的配置,例如api键和URL。这些应使用单独的ENV变量(例如APP_ENV
)进行区分。
我通常使用APP_ENV
来区分staging
和live
环境。
在不同环境下使用不同的启动脚本,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-env
:
npm install custom-env
完整的文档在这里:https://www.npmjs.com/package/custom-env