对设置NODE_ENV的方式感到困惑

时间:2016-06-13 19:32:42

标签: javascript node.js coding-style environment-variables

我试图设置一个标志,告知我的代码是否在生产或开发中。到目前为止,我已经看到了:

在VS Code的launch.json中:

{ "configurations": { "env": "NODE_ENV": "development" } }

在节点package.json中:

{ "scripts": { "start": "NODE_ENV=production" } }

在Webpack' webpack.config.js

module.exports = { "plugins": new webpack.DefinePlugin({ 'process.env.NODE_ENV': '"production"' }) }

运行代码时:

set NODE_ENV=production && node app

NPM套餐:

https://www.npmjs.com/package/envify

Powershell的:

$env:NODE_ENV="production"

我想我只是感到困惑,因为默认情况下我目前有大约4个。这些互动究竟如何?它们都指的是同一个变量吗?我应该只有其中一个吗?哪些会覆盖其他人?

我真的更喜欢只有一个点来设置它,因为似乎每个模块都允许你指定它,因此,我对它实际设置的位置感到困惑。另外,无论如何都要在客户端访问此标志,还是仅在服务器端?

1 个答案:

答案 0 :(得分:1)

在您指定的方案中,NODE_ENV环境变量将由实际执行代码的进程初始化。请参阅以下摘录自environment variable wikipedia

  

在所有Unix和类Unix系统中,每个进程都有自己独立的环境变量集。默认情况下,创建进程时,它会继承其父进程的重复环境,但父进程在创建子进程时所做的显式更改除外。在API级别,必须在运行fork和exec之间完成这些更改。或者,从命令shell(如bash)中,用户可以通过env或使用ENVIRONMENT_VARIABLE=VALUE <command>表示法间接调用它来更改特定命令调用的环境变量。所有Unix操作系统风格,DOS和Windows都有环境变量;但是,它们并不都使用相同的变量名称。正在运行的程序可以访问环境变量的值以进行配置。

因此,如果您使用pm2运行代码,那么pm2将在执行您的应用程序之前实际分配NODE_ENV环境变量。它使用JSON file for options,您可以使用env属性指定环境变量。

简而言之,设置NODE_ENV的所有方法或多或少都相同,只是归结为谁开始您的流程。

由于环境变量是机器的本地变量(环境),因此它们是在本地设置的,不能由客户设置。