无法在客户端访问 gatsby 环境变量
Can't access gatsby environment variables on the client side
我设置了 .env 文件和 gatsby-config.js 如下。
// .env.development
GATSBY_API_URL=https://example.com/api
// gatsby-config.js
console.log(process.env)
...
...
虽然当 运行 gatsby develop
时,它会显示所有环境变量,包括 GATSBY_API_URL: 'https://example.com/api'
,
但是浏览器上没有环境变量。
// client side
console.log(process.env) // => this will return {} empty object
我想我按照 https://www.gatsbyjs.org/docs/environment-variables/ 的说法,并在 var.
中添加了 GATSBY_
前缀
为什么我在客户端看不到环境变量是有原因的?
gatsby info --clipboard
System:
OS: macOS Sierra 10.12.6
CPU: (4) x64 Intel(R) Core(TM) i5-4258U CPU @ 2.40GHz
Shell: 5.2 - /bin/zsh
Binaries:
Node: 11.2.0 - /usr/local/bin/node
Yarn: 1.9.4 - /usr/local/bin/yarn
npm: 6.4.1 - /usr/local/bin/npm
Browsers:
Chrome: 70.0.3538.110
Firefox: 63.0.3
Safari: 12.0.2
npmPackages:
gatsby: ^2.0.61 => 2.0.61
gatsby-image: ^2.0.22 => 2.0.22
gatsby-plugin-google-analytics: ^2.0.8 => 2.0.8
gatsby-plugin-manifest: ^2.0.11 => 2.0.11
gatsby-plugin-no-sourcemaps: ^2.0.1 => 2.0.1
gatsby-plugin-nprogress: ^2.0.7 => 2.0.7
gatsby-plugin-react-helmet: ^3.0.4 => 3.0.4
gatsby-plugin-sass: ^2.0.5 => 2.0.5
gatsby-plugin-sharp: ^2.0.14 => 2.0.14
gatsby-plugin-styled-components: ^3.0.4 => 3.0.4
gatsby-plugin-typescript: ^2.0.2 => 2.0.2
gatsby-plugin-typography: ^2.2.2 => 2.2.2
gatsby-plugin-webpack-bundle-analyzer: ^1.0.3 => 1.0.3
gatsby-source-filesystem: ^2.0.10 => 2.0.10
gatsby-transformer-sharp: ^2.1.9 => 2.1.9
gatsby-transformer-yaml: ^2.1.6 => 2.1.6
npmGlobalPackages:
gatsby-cli: 2.4.5
应该可以解决您的问题的几个步骤和注意事项:
console.log(process.env)
将始终打印空对象
要查看它是否真的有效,您应该直接打印变量,例如console.log(process.env.API_URL)
.
确保 .env.* 在您的根文件夹中
换句话说,您的文件夹层次结构应如下所示:
.env.development
.env.production
src/
pages/
index.js
如果您想在服务器端访问环境变量,则无需使用 GATSBY_ 作为前缀
来自文档:
In addition to these Project Environment Variables defined in .env.* files, you could also define OS Env Vars. OS Env Vars which are prefixed with GATSBY_ will become available in browser JavaScript.
如果您在浏览器端使用它们,则需要 GATSBY_* 前缀
仅当您使用 OS Env Vars 方法(即您直接在您的服务器上而不是在这些 .env 文件中设置它们)时才使用前缀。
添加 .env 文件后,关闭并重新启动 gatsby develop
我 运行 在 CodeSandbox 上复制时进入这个(在 CodeSandbox 中,您通过转到左侧的服务器控制面板并单击重新启动沙箱来重新启动)。
可能值得注意的是,如果您习惯于编写 .dev
或 .develop
.
,则很容易将文件命名错误
Gatsby 要求文件命名准确:.env.development
确保你已经包含
require("dotenv").config({
path: `.env.${process.env.NODE_ENV}`,
})
在你的 gatsby-config.js 文件中,然后再开始使用你的 ENV 变量。
在 Gatsby 中,环境变量的可用性取决于许多因素:
- 执行上下文。您是否尝试访问变量 client-side 或 server-side?
- 变量名。以
GATSBY_
开头的名称将被区别对待。
- 环境文件名。默认情况下,Gatsby 期望它们是
.env.production
和 .env.development
.
- DotEnv 用法。是否使用
dotenv
npm 包加载 env 文件。
以下是使环境变量在服务器和浏览器环境中可访问的不同方法。选择最适合您的设置。
Server-side:
1.定义一个 OS 环境变量。
MY_VAR='my value'; export MY_VAR // will persist in the OS environment
npm run start
或
MY_VAR='my value' npm run start // will set the variable for that process only
注意:变量名无关紧要。
2。创建一个 env 文件并在那里定义变量。
echo MY_VAR='my value' >> .env.development
加载gatsby-config.js中的文件:
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
注意:文件名无关紧要。变量名无关紧要。
Client-side:
1.创建一个 .env.development
(.env.production
for prod 环境)文件并在其中定义一个变量。
注意:文件名很重要。变量名无关紧要。
2。创建一个不同名称的环境文件(比如 .env
)并在那里定义一个 GATSBY_
前缀变量。
echo GATSBY_MY_VAR='my value' >> .env
使用dotenv
加载gatsby-config.js
中的文件。
require('dotenv').config() // .env is loaded by default, no need to specify path
注意:文件名无关紧要。变量名很重要。
3。定义一个 GATSBY_
前缀为 OS 的环境变量。
GATSBY_MY_VAR='my value'; export GATSBY_MY_VAR
npm run start
或
GATSBY_MY_VAR='my value' npm run start
注意:变量名很重要。
您可以将您的环境密钥添加到 gatsby 的允许列表中-config.js
{
resolve: `gatsby-plugin-env-variables`,
options: {
allowList: [
"XXXXXXXXX",
]
}
}
如果您计划使用单个 .env
文件(而不是 .env.development
和 .env.production
之类的文件),那么将其添加到 gatsby-config.js
应该可以解决问题:
require('dotenv').config({
path: '.env',
})
我设置了 .env 文件和 gatsby-config.js 如下。
// .env.development
GATSBY_API_URL=https://example.com/api
// gatsby-config.js
console.log(process.env)
...
...
虽然当 运行 gatsby develop
时,它会显示所有环境变量,包括 GATSBY_API_URL: 'https://example.com/api'
,
但是浏览器上没有环境变量。
// client side
console.log(process.env) // => this will return {} empty object
我想我按照 https://www.gatsbyjs.org/docs/environment-variables/ 的说法,并在 var.
中添加了GATSBY_
前缀
为什么我在客户端看不到环境变量是有原因的?
gatsby info --clipboard
System:
OS: macOS Sierra 10.12.6
CPU: (4) x64 Intel(R) Core(TM) i5-4258U CPU @ 2.40GHz
Shell: 5.2 - /bin/zsh
Binaries:
Node: 11.2.0 - /usr/local/bin/node
Yarn: 1.9.4 - /usr/local/bin/yarn
npm: 6.4.1 - /usr/local/bin/npm
Browsers:
Chrome: 70.0.3538.110
Firefox: 63.0.3
Safari: 12.0.2
npmPackages:
gatsby: ^2.0.61 => 2.0.61
gatsby-image: ^2.0.22 => 2.0.22
gatsby-plugin-google-analytics: ^2.0.8 => 2.0.8
gatsby-plugin-manifest: ^2.0.11 => 2.0.11
gatsby-plugin-no-sourcemaps: ^2.0.1 => 2.0.1
gatsby-plugin-nprogress: ^2.0.7 => 2.0.7
gatsby-plugin-react-helmet: ^3.0.4 => 3.0.4
gatsby-plugin-sass: ^2.0.5 => 2.0.5
gatsby-plugin-sharp: ^2.0.14 => 2.0.14
gatsby-plugin-styled-components: ^3.0.4 => 3.0.4
gatsby-plugin-typescript: ^2.0.2 => 2.0.2
gatsby-plugin-typography: ^2.2.2 => 2.2.2
gatsby-plugin-webpack-bundle-analyzer: ^1.0.3 => 1.0.3
gatsby-source-filesystem: ^2.0.10 => 2.0.10
gatsby-transformer-sharp: ^2.1.9 => 2.1.9
gatsby-transformer-yaml: ^2.1.6 => 2.1.6
npmGlobalPackages:
gatsby-cli: 2.4.5
应该可以解决您的问题的几个步骤和注意事项:
console.log(process.env)
将始终打印空对象
要查看它是否真的有效,您应该直接打印变量,例如console.log(process.env.API_URL)
.
确保 .env.* 在您的根文件夹中
换句话说,您的文件夹层次结构应如下所示:
.env.development
.env.production
src/
pages/
index.js
如果您想在服务器端访问环境变量,则无需使用 GATSBY_ 作为前缀
来自文档:
In addition to these Project Environment Variables defined in .env.* files, you could also define OS Env Vars. OS Env Vars which are prefixed with GATSBY_ will become available in browser JavaScript.
如果您在浏览器端使用它们,则需要 GATSBY_* 前缀
仅当您使用 OS Env Vars 方法(即您直接在您的服务器上而不是在这些 .env 文件中设置它们)时才使用前缀。
添加 .env 文件后,关闭并重新启动 gatsby develop
我 运行 在 CodeSandbox 上复制时进入这个(在 CodeSandbox 中,您通过转到左侧的服务器控制面板并单击重新启动沙箱来重新启动)。
可能值得注意的是,如果您习惯于编写 .dev
或 .develop
.
Gatsby 要求文件命名准确:.env.development
确保你已经包含
require("dotenv").config({
path: `.env.${process.env.NODE_ENV}`,
})
在你的 gatsby-config.js 文件中,然后再开始使用你的 ENV 变量。
在 Gatsby 中,环境变量的可用性取决于许多因素:
- 执行上下文。您是否尝试访问变量 client-side 或 server-side?
- 变量名。以
GATSBY_
开头的名称将被区别对待。 - 环境文件名。默认情况下,Gatsby 期望它们是
.env.production
和.env.development
. - DotEnv 用法。是否使用
dotenv
npm 包加载 env 文件。
以下是使环境变量在服务器和浏览器环境中可访问的不同方法。选择最适合您的设置。
Server-side:
1.定义一个 OS 环境变量。
MY_VAR='my value'; export MY_VAR // will persist in the OS environment
npm run start
或
MY_VAR='my value' npm run start // will set the variable for that process only
注意:变量名无关紧要。
2。创建一个 env 文件并在那里定义变量。
echo MY_VAR='my value' >> .env.development
加载gatsby-config.js中的文件:
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
注意:文件名无关紧要。变量名无关紧要。
Client-side:
1.创建一个 .env.development
(.env.production
for prod 环境)文件并在其中定义一个变量。
注意:文件名很重要。变量名无关紧要。
2。创建一个不同名称的环境文件(比如 .env
)并在那里定义一个 GATSBY_
前缀变量。
echo GATSBY_MY_VAR='my value' >> .env
使用dotenv
加载gatsby-config.js
中的文件。
require('dotenv').config() // .env is loaded by default, no need to specify path
注意:文件名无关紧要。变量名很重要。
3。定义一个 GATSBY_
前缀为 OS 的环境变量。
GATSBY_MY_VAR='my value'; export GATSBY_MY_VAR
npm run start
或
GATSBY_MY_VAR='my value' npm run start
注意:变量名很重要。
您可以将您的环境密钥添加到 gatsby 的允许列表中-config.js
{
resolve: `gatsby-plugin-env-variables`,
options: {
allowList: [
"XXXXXXXXX",
]
}
}
如果您计划使用单个 .env
文件(而不是 .env.development
和 .env.production
之类的文件),那么将其添加到 gatsby-config.js
应该可以解决问题:
require('dotenv').config({
path: '.env',
})