将.env文件添加到React Project


84

我试图在提交到github时隐藏我的API密钥,并且我在论坛中浏览了相关指南,尤其是以下文章:

如何在create-react-app中隐藏API密钥?

我进行了更改,然后重新开始了纱线。我不确定自己在做什么错–我.env在项目的根目录(我将其命名为process.env)中添加了一个文件,并在我刚刚放入的文件中添加了一个文件REACT_APP_API_KEY = 'my-secret-api-key'

我认为这可能是fetch在App.js中向我添加密钥的方式,并且我尝试了多种格式,包括不使用模板文字,但是我的项目仍然无法编译。

任何帮助深表感谢。

performSearch = (query = 'germany') => {
    fetch(`https://api.unsplash.com/search/photos?query=${query}&client_id=${REACT_APP_API_KEY}`)
    .then(response => response.json())
    .then(responseData => {
        this.setState({
            results: responseData.results,
            loading: false
        });
     })
     .catch(error => {
            console.log('Error fetching and parsing data', error);
     });
}


而不是将其process.env命名.env.local or .env.process 并保存在src目录之外
RIYAJ KHAN

1
@RIYAJKHAN,您好:我已将文件更改为.env.local,并且绝对在src目录之外,但我仍未定义REACT_APP_API_KEY:/
Bianca M

1
对我而言,解决此问题的方法只是关闭运行我的本地开发服务器的终端并重新运行npm run start
n00bAppDev

3
您无法在React应用中隐藏秘密。见stackoverflow.com/a/46839021/4722345
JBallin '18年

5
不要使用它来存储机密。来自文档...WARNING: Do not store any secrets (such as private API keys) in your React app! Environment variables are embedded into the build, meaning anyone can view them by inspecting your app's files.
Nishant Mehta,

Answers:


97

4个步骤

  1. npm install dotenv --save

  2. 接下来,将以下行添加到您的应用中。

    require('dotenv').config()

  3. 然后.env在应用程序的根目录中创建一个文件,并将变量添加到其中。

// contents of .env 

REACT_APP_API_KEY = 'my-secret-api-key'
  1. 最后,添加.env到您的.gitignore文件中,以便Git忽略它,并且它永远不会在GitHub上结束。

如果您使用的是create-react-app,则只需执行第3步和第4步,但请记住,变量必须以REACT_APP_它开始起作用。

参考:https : //create-react-app.dev/docs/adding-custom-environment-variables/

注意-在.env文件中添加变量后,需要重新启动应用程序。

参考-https: //medium.com/@thejasonfile/using-dotenv-package-to-create-environment-variables-33da4ac4ea8f


34
如果您使用“ create-react-app”创建react应用程序,则需要在.env文件中添加变量后重新启动应用程序。在变量名称前使用“ REACT_APP_”。
vikash

@tarzen chugh例如,如果我将应用程序部署到AWS,该怎么办。由于.env是gitignore的一部分,它不会被忽略吗?我该如何进行生产呢?
user2763557 '19

@vikash对我而言已是这句话,不容置疑,影响很大
Benyam Ephrem

我要在哪里添加require('dotenv').config()?哪个文件?
aqteifan

@aqteifan您无需添加该代码段,但是.ENV文件命名起着至关重要的作用
测试于

83

因此,我本人还是React的新手,我找到了一种方法。

此解决方案不需要任何额外的程序包。

第1步ReactDocs

在上面的文档中,他们提到了Shell中的export和其他选项,我尝试解释的是使用.env文件

1.1创建Root / .env

#.env file
REACT_APP_SECRET_NAME=secretvaluehere123

重要说明,必须REACT_APP_开头

1.2访问ENV变量

#App.js file or the file you need to access ENV
<p>print env secret to HTML</p>
<pre>{process.env.REACT_APP_SECRET_NAME}</pre>

handleFetchData() { // access in API call
  fetch(`https://awesome.api.io?api-key=${process.env.REACT_APP_SECRET_NAME}`)
    .then((res) => res.json())
    .then((data) => console.log(data))
}

1.3 Build Env问题

因此,在执行步骤1.1 | 2之后,它不起作用,然后发现了上述问题/解决方案。React构建时会读取/创建env,因此每次修改.env文件时都需要npm run start,以便变量得到更新。


7
我认为这是正确的答案!无需其他软件包,也无需使用正确的React方法导入环境变量。其他方法也可以使用,但是为什么要为您添加软件包和代码配置呢?好答案!
瑞安

12
我想念这REACT_APP_谢谢。没有其他人提到它。
rotimi-best

由于某种原因,这对我不起作用。我得到undefined
Si8

@ Si8是否可以扩展您的错误/过程。您执行了哪一步undefined,将新变量添加到.env之后,是否重新启动了应用程序,请参见1.3
T04435

@ T04435感谢您的回答,伴侣的魅力就像REACT_APP_是这里的关键。另外我该如何为具有dev / beta / production的不同服务器进行配置,我是否需要为每个服务器使用不同的env文件?
Kannan T

33

今天,有一种更简单的方法可以做到这一点。

只需在根目录中创建.env.local文件,然后在其中设置变量即可。在您的情况下:

REACT_APP_API_KEY = 'my-secret-api-key'

然后以这种方式将其称为js文件:

process.env.REACT_APP_API_KEY

由于react-scripts@0.5.0,因此React支持环境变量。您不需要外部程序包就可以做到这一点。

https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#adding-development-environment-variables-in-env

*注:我建议使用.env.local而不是.env,因为在创建项目时create-react-app将此文件添加到gitignore中。

文件优先级:

npm开始:.env.development.local,.env.development,.env.local,.env

npm运行构建:.env.production.local,.env.production,.env.local,.env

npm测试:.env.test.local,.env.test,.env(请注意,缺少.env.local)

更多信息:https : //facebook.github.io/create-react-app/docs/adding-custom-environment-variables


正确的命名为我完成了工作。我使用.env.dev,而React在寻找.env.development
时又

25

Webpack用户

如果您使用的是webpack,则可以dotenv-webpack按照以下步骤安装和使用插件:

安装套件

yarn add dotenv-webpack

建立.env档案

// .env
API_KEY='my secret api key'

将其添加到webpack.config.js文件

// webpack.config.js
const Dotenv = require('dotenv-webpack');

module.exports = {
  ...
  plugins: [
    new Dotenv()
  ]
  ...
};

在您的代码中将其用作

process.env.API_KEY

有关更多信息和配置信息,请访问此处


如果您使用的是webpack-devserver,则只有重新启动它才能看到更改。
艾萨克·朴

这对我来说是最好的解决方案。谢谢。注意事项:我使用的是服务器端渲染,因此我不得不同时更新两个webpack文件(客户端也是如此)。
豪尔赫·毛里西奥

@Aminu Kano,如果我在源代码中在线查看bundle.js文件,如果api-key仍然可见,您能解释一下使用这种方法的意义吗?
Linas M.

@LinasM。是的,但是“在线”是什么意思?
阿米努卡诺

1
@AminuKano,是的,这很清楚地解释了这一点。谢谢
Linas M.

9

1.在您的根文件夹中创建.env文件

有些消息源倾向于使用.env.development.env.production但这不是强制性的。

2.您的VARIABLE名称-必须以REACT_APP_YOURVARIABLENAME开头

看来,如果您的环境变量不是这样启动的,那么您将遇到问题

3.包含您的变量

包括环境变量,只需将其放在代码中 process.env.REACT_APP_VARIABLE

您不必安装任何外部依赖项


我做同样的事情,但在控制台中显示未定义
PRADIP GORULE

我可以确认。这是行不通的。
假设

1
如果获取的值未定义,请再次重新编译。
匿名

8

您必须安装npm install env-cmd

在根目录中创建.env并像这样进行更新,并且REACT_APP_是变量名的强制前缀。

REACT_APP_NODE_ENV="production"
REACT_APP_DB="http://localhost:5000"

更新package.json

  "scripts": {
    "start": "env-cmd react-scripts start",
    "build": "env-cmd react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  }

6
  1. dotenv作为devDependencies安装:
npm i --save-dev dotenv
  1. .env在根目录中创建一个文件:
my-react-app/
|- node-modules/
|- public/
|- src/
|- .env
|- .gitignore
|- package.json
|- package.lock.json.
|- README.md
  1. .env如下所示更新文件,并且REACT_APP_是变量名的强制前缀。
REACT_APP_BASE_URL=http://localhost:8000
REACT_APP_API_KEY=YOUR-API-KEY
  1. [可选,但好的做法]现在,您可以创建一个配置文件来存储变量并导出变量,以便可以从其他文件中使用它。

例如,我创建了一个名为的文件,base.js并按如下所示进行更新:

export const BASE_URL = process.env.REACT_APP_BASE_URL;
export const API_KEY = process.env.REACT_APP_API_KEY;
  1. 或者,您可以仅通过以下方式在JS文件中调用环境变量:
process.env.REACT_APP_BASE_URL

仅使用单个.env文件时,如何区分开发环境和生产环境?我知道我们需要创建.env.development.env.prod归档,但是如何使用您的方法区分它们?
ameyaraje

@ameyaraje基本上,我们忽略我们的.env文件.gitignore。因此,在部署时,我们只需将.env文件复制到我们的服务器,然后更改BASE_URL和其他必要的值即可。这样,当它需要部署最新代码时,我们只需从git master中提取并部署它即可。我们不会考虑.env它,因为我们一开始就忽略它并将其设置在我们的服务器中。谢谢!
Fatema T. Zuhora

process.env.REACT_APP_API_KEY没有给出显示未定义的值。我确实停止了服务器并使用npm start重新启动
vikramvi

@vikramvi您是否将值放在REACT_APP_BASE_URL.env文件中名为same的变量中?
Fatema T. Zuhora

@ FatemaT.Zuhora这是我的错,我把.env错误地放在了子目录中,而不是把它放在根目录下
vikramvi,

0

如果要获取的值为undefined,则应考虑重新启动节点服务器并再次重新编译。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.