27

我设置 .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/的说法,并GATSBY_在 var 中添加了前缀。

我在客户端看不到 env var 有什么原因吗?

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
4

6 回答 6

35

几个步骤和注意事项应该可以解决您的问题:

console.log(process.env)将始终打印空对象

要查看它是否真的有效,您应该直接打印变量,例如console.log(process.env.API_URL).

确保 .env.* 在您的根文件夹中

换句话说,您的文件夹层次结构应该类似于:

.env.development
.env.production
src/
  pages/
    index.js

如果要在服务器端访问环境变量,则不需要前缀 GATSBY_

从文档:

除了在 .env.* 文件中定义的这些项目环境变量之外,您还可以定义 OS Env Vars。以 GATSBY_ 为前缀的 OS Env Vars 将在浏览器 JavaScript 中可用。

如果您在浏览器端使用它们,则需要 GATSBY_* 前缀

仅当您使用 OS Env Vars 方法时才使用前缀(即直接在服务器上设置它们,而不是在这些 .env 文件中)。

gatsby develop添加 .env 文件后终止并重新启动

我在 CodeSandbox 上复制时遇到了这个问题(在 CodeSandbox 中,您可以通过转到左侧的服务器控制面板并单击重新启动沙箱来重新启动)。

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

于 2018-12-12T14:29:41.753 回答
12

也许值得注意的是,如果您习惯于编写.dev.develop.

Gatsby 要求文件命名准确:.env.development

于 2019-08-08T09:10:35.520 回答
11

确保您已包含

require("dotenv").config({
  path: `.env.${process.env.NODE_ENV}`,
})

在你开始使用你的 ENV 变量之前,在你的 gatsby-config.js 文件中。

于 2020-07-12T12:17:21.673 回答
3

在 Gatsby 中,环境变量的可用性取决于许多因素:

  • 执行上下文。您是在尝试访问变量客户端还是服务器端?
  • 变量的名称。以 开头的名称GATSBY_被区别对待。
  • 环境文件名。默认情况下,Gatsby 期望这些是.env.production.env.development
  • DotEnv 用法。是否使用dotenvnpm 包来加载 env 文件。

以下是使环境变量在服务器和浏览器环境中可访问的不同方法。选择最适合您的设置的。

服务器端:

1. 定义操作系统环境变量。

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}`,
})

注意:文件名无关紧要。变量名无关紧要。

客户端:

1. 创建一个.env.development.env.production用于 prod 环境)文件并在其中定义一个变量。

注意:文件名很重要。变量名无关紧要。

2. 创建一个以不同名称命名的环境文件(比如.env)并在那里定义一个GATSBY_前缀变量。

echo GATSBY_MY_VAR='my value' >> .env

将文件加载gatsby-config.jsdotenv.

require('dotenv').config() // .env is loaded by default, no need to specify path

注意:文件名无关紧要。变量名确实很重要。

3. 定义一个带GATSBY_前缀的操作系统环境变量。

GATSBY_MY_VAR='my value'; export GATSBY_MY_VAR
npm run start

或者

GATSBY_MY_VAR='my value' npm run start

注意:变量名很重要。

于 2020-09-29T16:53:17.610 回答
0

您可以将您的 env 密钥添加到 gatsby-config.js 中的允许列表中

{ 
  resolve: `gatsby-plugin-env-variables`,
    options: {
      allowList: [
        "XXXXXXXXX", 
      ]
    }
}
于 2020-11-30T11:31:18.413 回答
-1

如果您打算使用单个.env文件(而不是像.env.developmentand之类的文件.env.production),那么添加它gatsby-config.js应该可以解决问题:

require('dotenv').config({
  path: '.env',
})
于 2021-05-20T18:01:55.733 回答