reactjs - Gatsby,浏览器中无法访问的环境变量
问题描述
我想使用环境变量。我创建了.env.development
文件并放置了一些变量。然后我包含dotenv
插件来读取变量gatsby-config.js
:
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`
});
我的内容.env.development
:
GATSBY_APP=MYAPP
它正在运行,gatbsy-node.js
但在浏览器(REACT)中它是空的。我显示console.log(process.env)
并返回空对象。
即使我安装和配置gatsby-plugin-env-variables
.
解决方案
看起来您正在结合两种方法,这可能是您遇到麻烦的地方。
Gatsby 开箱即用,支持在特定于环境的
.env.[environment]
文件(例如.env.development
)中定义环境变量,前提是这些文件位于项目的根目录中(例如your-project/.env.development
)。 此功能的文档。您无需安装或配置dotenv
即可使用。另一种方法是使用dotenv,这将允许您使用通用
.env
文件。然后您需要导入和配置该工具,该工具通常在最上面一行完成,gatsby-config.js
如下所示:require("dotenv").config()
请注意,在这种情况下您没有指定环境名称(例如development
),并且您不会将.env
文件提交到您的存储库。
您可能遇到的另一个问题是您的部分代码使用 Node 在服务器端运行,而部分代码在客户端(在浏览器中)运行。由于process.env
仅在 Node 中可用,Gatsby 做了一些额外的工作以使其在浏览器中可用。不过,我们不希望将所有这些经常包含秘密的变量都提供给浏览器,因此 Gatsby 只复制那些名称以 . 开头的变量GATSBY_
。最后,作为这些变量被复制的方式的副作用,您必须显式引用它们以使您的构建工作:
// this is okay everywhere
const GATSBY_APP = process.env.GATSBY_APP
// this won't work in code that runs client-side, but will work
// in `gatsby-node.js` and other files that only run in Node
const { GATSBY_APP } = process.env
推荐阅读
- string - 如何删除字典中的标点符号
- unity3d - 在 unity probuilder 中,如何使用选定的顶点创建新面
- sql-server - 使用临时表比较 SQL Server 存储过程中的 2 个表
- r - 获取变量之间的所有成对散点图
- keylistener - 在一个类中实现 keylistener 以使用在另一个类中创建的 jframe
- python - 困难,包括 python linter 范围内的额外智能感知路径
- java - 主线程如何向子线程传递信息(如何在run方法中处理消息?)?
- java - OnClickListener 导致无限循环
- spring - 传递一个角色来验证来自邮递员的基本 http
- r - 如何制作嵌套的 purrr 映射以基于动态变量而不是嵌套循环来提取行?