无法在客户端访问 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 中,您通过转到左侧的服务器控制面板并单击重新启动沙箱来重新启动)。

这是工作示例:https://codesandbox.io/s/jj8xzn2y15

可能值得注意的是,如果您习惯于编写 .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',
})