访问NODE_ENV在前端代码中有意义吗?

ice*_*y-t 7 environment node.js reactjs

我有一个我正在部署的react/node应用程序.其中一个组件尝试访问NODE_ENV以确定要使用的主机URL(localhost或heroku).

我现在意识到即使NODE_ENV被设置为生产,它在浏览器上下文中总是"未定义",因为环境不是节点.

由于我无法从反应组件访问NODE_ENV,如何动态设置主机服务器?

Rya*_*cox 7

其中一个组件尝试访问 NODE_ENV 以确定要使用的主机 URL(localhost 或 heroku)。

是的,绝对!

在构建时和运行时使用东西是有区别的。您将NODE_ENV在构建时使用 - 比如说您运行webpack或构建一些 JSX 或其他任何东西。

NODE_ENV当用户访问您的网站时,您将不会在运行时使用。在该 Web 浏览上下文中没有环境变量的概念。

在这种情况下,我所做的是以编程方式创建一个文件,该文件将有条件地包含 Web 服务器 URL。或者甚至捕获该NODE_ENV值并将其放入应用程序中以备后用。

举一个实际的例子:在几年前我参与的一个 React 项目中,我们自动生成了 index.html 文件。这是一个愚蠢的小文件,引入了<script>我们需要的Javascript 标签,并<div>为 React 应用程序添加了一个要渲染的。在模板语言中,我们做了这样的事情:

索引.html.模板

<html><body ENVIRONMENT="$NODE_ENV"></body></html>
Run Code Online (Sandbox Code Playgroud)

在该文件从我们构建管道的另一端出来后,我们的生产构建看起来像这样:

索引.html

<html><body ENVIRONMENT="PRODUCTION"></body></html>
Run Code Online (Sandbox Code Playgroud)

然后我们只是使用普通的 DOM Javascript 来抓取 body 元素并检查属性(然后将它放在 Redux 存储中?我完全忘记了)。

在用户访问时,我们有一个明显的硬编码值“生产”。但你我更清楚!

更新:我忘了,实际上在 Webpack 本身中有两种方法可以做到这一点,而不使用外部模板工具并生成像我在这里描述的文件!

  1. 使用 WebPack 定义插件。这实际上将为您的转译阶段添加另一个步骤:进入并用其他一些文字字符串替换文字字符串的步骤。所以let e = "NODE_ENV"会变成let e = "production". 有一篇关于 defineplugin很好的 Medium 博客文章,它很酷。

  2. Webpack 本身有一些环境变量支持。显然,如果您使用webpack --env.NODE_ENV=production. 那么......也许你可以使用process.env.NODE_ENV此功能Webpack 文档对此并不十分清楚


riw*_*iwu 4

NODE_ENV对于 API URL 等内容使用变量是一个很好的做法。

如果您使用,则所有以 开头的环境变量REACT_APP_应该已经可以通过 访问process.env.REACT_APP_VARIABLE_NAME。那
你可以试试。REACT_APP_TEST=5 npm startconsole.log(process.env.REACT_APP_TEST)

如果您不使用create-react-app,则必须将它们导入到您的 webpack 配置中。

您还可以选择使用dotenvprocess.env通过文件定义应用程序的变量。.env