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

avi*_*per 19 environment-variables node.js

因此,我在运行带有 webpack 的 react-redux 应用程序的节点机器上有一个最简单的示例(尽管我认为这对问题没有任何影响,但希望它在 nodejs 上)。

具体调用获取超值包:

console.log(process.env.NODE_ENV); // output: 'development'
Run Code Online (Sandbox Code Playgroud)

一般电话一无所获:

console.log(process.env); // output: {}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

可能相关的附加信息:

  • 我使用dotenvtest环境。
  • dotenv-webpack用于开发环境。
  • 我没有在production部署到 Heroku的环境中使用它们
  • 该问题在所有环境中仍然存在。

Mil*_*sky 12

这个问题process.env的变量是在浏览器空是因为浏览器不具有真正的访问processnode.js。虽然它在浏览器中运行。

的使用process.env.ANYTHING通常是通过像https://webpack.js.org/plugins/define-plugin/这样的插件来实现的,它只是在 BUILD 期间replace发生的任何process.env.ANYTINHGwith env 变量。这确实很简单,str.replace(/process.env.ANYTING/value/)这需要在构建期间完成,因为一旦您输出 dist,bundle.js您就无法访问ENV变量。

在构建期间更换

因此,您需要确保在生成生产构建时,例如yarn build使用当前 ENV 值使用webpack.DefinePlugin和替换这些process.env调用。它们不能在运行时注入。

运行时注入

当您需要在运行时访问 env 变量时,在浏览器中的 JavaScript 中基本上是不可能的。例如,NGINX 有一些技巧可以将当前的 env 变量序列化为变量,window.ENV并且在您的应用程序中您不会使用process.envwindow.ENV. 因此,您需要在构建应用程序时使用 ENV 变量,或者构建将当前 ENV 作为 json 动态输出到窗口并通过 react 访问的机制。如果您正在使用docker它可以完成,ENTRYPOINT否则您需要一些 bash 脚本,该脚本将始终输出与您的应用程序JSON有关index.html的当前 ENV 变量