为什么process.env返回空对象,而process.env.prop返回prop值?

时间:2019-07-16 12:20:36

标签: node.js environment-variables

因此,我在运行带有webpack的react-redux应用程序的节点计算机上有一个最简单的示例(尽管我认为这个问题无关紧要,因为它应该在nodejs上。)

特定呼叫获得价值包:

console.log(process.env.NODE_ENV); // output: 'development'

常规电话无济于事:

console.log(process.env); // output: {}

我在这里想念什么?

可能与 相关的附加信息:

  • 我在dotenv环境中使用test
  • 我在开发环境中使用dotenv-webpack
  • 对于部署到Heroku的production环境,我都不会使用它们
  • 该问题在所有环境中仍然存在。

1 个答案:

答案 0 :(得分:1)

process.env变量在浏览器中为空的问题是因为浏览器无法真正访问process中的node.js。它虽然在浏览器中运行。

process.env.ANYTHING的使用通常是通过https://webpack.js.org/plugins/define-plugin/之类的插件来实现的,它们仅在构建期间简单地replace出现任何带有env变量的process.env.ANYTINHG。它确实确实很简单str.replace(/process.env.ANYTING/value/),这需要在构建期间完成,因为一旦输出dist bundle.js,您将无权访问ENV变量。

在构建期间替换

因此,您需要确保在生产生产版本时(例如,使用yarn build)使用webpack.DefinePlugin并将那些process.env调用替换为当前的ENV值。它们不能在运行时注入。

在运行时注入

当您需要在运行时访问环境变量时,在浏览器的JavaScript中基本上是不可能的。例如,NGINX可以利用某种黑客手段将当前env变量序列化为window.ENV变量,在您的应用中,您将不使用process.env而是window.ENV。因此,您在构建应用程序时需要使ENV变量可用,或者需要构建机制将当前ENV作为json动态输出到window并通过react访问。如果您使用的是docker,则可以使用ENTRYPOINT完成,否则您将需要一些bash脚本,该脚本将始终将当前的ENV变量作为JSON输出到应用程序的index.html