其中一个组件尝试访问 NODE_ENV 以确定要使用的主机 URL(localhost 或 heroku)。
是的,绝对!
在构建时和运行时拥有东西之间存在差异。你将会有NODE_ENV
在构建时附近 - 假设你运行webpack
或者构建一些 JSX 之类的东西。
你不会有NODE_ENV
在运行时,当用户访问您的网站时。该网络浏览上下文中没有环境变量的概念。
在本例中,我所做的是以编程方式创建一个有条件地包含 Web 服务器 URL 的文件。或者甚至捕获NODE_ENV
并将该值放入应用程序中以供稍后使用。
举一个实际的例子:在几年前我参与的一个 React 项目中,我们自动生成了我们的 index.html 文件。这是一个愚蠢的小文件,引入了我们的<script>
我们需要的 Javascript 标签并添加<div>
让 React 应用程序渲染。在模板语言中,我们做了如下操作:
索引.html.模板
<html><body ENVIRONMENT="$NODE_ENV"></body></html>
该文件从我们的构建管道的另一端出来后,对于我们的生产构建来说它看起来像这样:
索引.html
<html><body ENVIRONMENT="PRODUCTION"></body></html>
然后我们只使用普通的 DOM Javascript 来获取 body 元素并检查属性(然后将其放入 Redux 存储中?我完全忘记了)。
在用户访问时,我们有一个明显硬编码的“生产”值。但你和我更清楚!
Update: 我忘了,实际上有两种方法可以做到这一点在 Webpack 本身中,无需使用外部模板工具并生成我在此处描述的文件!
使用 WebPack 定义插件。这实际上会在转译阶段添加另一个步骤:进入并用其他文字字符串替换文字字符串。所以let e = "NODE_ENV"
会成为let e = "production"
。有一个关于defineplugin 的优秀Medium 博客文章 https://medium.com/@justintulk/passing-environment-variables-into-your-code-with-webpack-cab09d8974b0,这有点酷。
Webpack 本身有一些环境变量支持。显然如果你运行 webpackwebpack --env.NODE_ENV=production
。那么...也许你可以使用process.env.NODE_ENV
? The 此功能的 Webpack 文档 https://webpack.js.org/guides/environment-variables/对此不太清楚