【问题标题】:Adding an .env file to React Project将 .env 文件添加到 React 项目
【发布时间】:2018-09-09 18:24:11
【问题描述】:

当我提交到 github 时,我试图隐藏我的 API 密钥,并且我查看了论坛以获取指导,尤其是以下帖子:

How do I hide API key in create-react-app?

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

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

非常感谢任何帮助。

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);
     });
}

【问题讨论】:

  • 嗨@RIYAJKHAN 我已将文件更改为 .env.local 并且它肯定在 src 目录之外,但我仍然没有定义 REACT_APP_API_KEY :/
  • 为我解决的只是关闭运行本地开发服务器的终端并重新运行npm run start
  • 你不能在 React 应用中隐藏秘密。请参阅 stackoverflow.com/a/46839021/4722345
  • 不要使用它来存储秘密。来自docs...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.
  • 您需要设置服务器并使用 JWT 等身份验证来隐藏它。阅读this suggestion 了解更多信息。

标签: reactjs environment-variables api-key


【解决方案1】:

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

【讨论】:

  • 在 .env 文件中添加变量后需要重新启动应用程序。如果您使用“create-react-app”创建反应应用程序,请在变量名前使用“REACT_APP_”。
  • @tarzen chugh 例如,如果我将我的应用程序部署到 AWS 会怎样。由于 .env 是 gitignore 的一部分,它不会被忽略吗?我怎样才能包括它的生产?
  • 在哪里添加require('dotenv').config()?哪个文件?
  • @aqteifan 你不需要添加那个sn-p,但是.ENV文件命名起着至关重要的作用
  • @user2763557 我使用的模式是创建一个 .env.example 文件,其中列出了 env 键的定义。然后,您可以复制 .env.example 并创建一个 .env 文件(在开发和生产中),其中包含您的有效值,例如键、基本 URL 等。您必须将 .env 文件添加到 .gitignore
【解决方案2】:

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

只需在根目录中创建 .env.local 文件并在那里设置变量。在你的情况下:

REACT_APP_API_KEY = 'my-secret-api-key'

然后你用这种方式在你的js文件中调用它:

process.env.REACT_APP_API_KEY

React 支持环境变量,因为 react-scripts@0.5.0 。你不需要外部包来做到这一点。

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 时退回到 .env
  • 最简单最好的!
  • 还有一个提示是重新启动服务器以正常工作
【解决方案3】:

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

更多信息和配置信息,请访问here

【讨论】:

  • 如果您使用的是 webpack-devserver,在您重新启动之前不会看到更改。
  • 这对我来说是最好的解决方案。谢谢。注意:我使用的是服务器端渲染,所以我必须更新两个 webpack 文件(客户端也是)。
  • @Aminu Kano 如果我在源代码中在线查看 bundle.js 文件,如果 api-key 仍然可见,您能否解释一下使用这种方法的意义何在?
  • @LinasM。是的,当然,但你所说的“在线”是什么意思?
  • @AminuKano,是的,这非常清楚地解释了这一点。谢谢
【解决方案4】:

所以我自己是 React 的新手,我找到了一种方法。

此解决方案不需要任何额外的软件包。

第一步ReactDocs

在上述文档中,他们提到了 Shell 中的导出和其他选项,我将尝试解释的是使用 .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 构建环境Issue

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

【讨论】:

  • 在我看来,这是正确的答案!无需额外的包,以及导入环境变量的正确 React 方式。其他方法也可以,但是既然已经为您完成了,为什么还要添加包和代码配置呢?很好的答案!
  • 我错过了这个REACT_APP_ 谢谢。没有其他人提到它。
  • 由于某种原因这对我不起作用。我得到undefined
  • @T04435 我已经有伙伴了,我指的是我需要为每个服务器提供不同的 .env 文件吗?
  • 我什么都试过了。 process.env.REACT_APP_API_KEYundefined
【解决方案5】:

你必须安装 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 基本上,我们忽略了.gitignore 中的.env 文件。因此,在部署时,我们只需将 .env 文件复制到我们的服务器并更改 BASE_URL 和其他必要的值。这样,当它需要部署最新的代码时,我们只需从 git master 拉取并部署即可。我们不考虑.env,因为我们忽略了它并在一开始就将它设置在我们的服务器中。谢谢!
  • process.env.REACT_APP_API_KEY 没有给出显示未定义的值。我确实停止了服务器并使用 npm start 重新启动
  • @vikramvi 您是否将值放在 .env 文件中名为相同 REACT_APP_BASE_URL 的变量中?
  • @FatemaT.Zuhora 这是我的错,我错误地将 .env 放在子目录中,而不是放在根目录下
【解决方案7】:

1。在根文件夹中创建 .env 文件

一些来源更喜欢使用.env.development.env.production,但这不是强制性的。

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

看来如果你的环境变量不是这样开始的那么你就会遇到问题

3。包括你的变量

要包含您的环境变量,只需在您的代码中添加process.env.REACT_APP_VARIABLE

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

【讨论】:

  • 我做同样的事情,但它在控制台中显示未定义
  • 如果您得到未定义的值,请重新编译。
  • 重新编译后仍然不确定。 console.log('process', process.env.REACT_APP_BASE_URL);
  • 确保您的根文件夹中有 .env 文件(与 package.json 相同的位置)而不是 src 文件夹中。
【解决方案8】:

如果你得到的值是undefined,那么你应该考虑重新启动节点服务器并重新编译。

【讨论】:

    【解决方案9】:

    每个人都不确定解决方案是将您的 .env 文件放在根目录中,例如

    • 项目名称/
    • 源代码
    • .env

    不要在 src 中创建文件夹在你的应用程序的根目录中创建

    它认为你们在 src 文件夹中创建了文件,因为我也只在那里创建了... 然后只有我意识到这是错误的,所以在 src 外部创建 .env 文件它会起作用

    【讨论】:

      【解决方案10】:

      我想好好解释一下如何解决这个问题以防止undefined问题:

      • 首先,在.env 中添加开发环境变量适用于react-scripts@0.5.0 及更高版本。这意味着你不必安装任何东西?。
      • 第二次创建您的.env 文件或.env_developement 文件或其他任何东西并放置您的变量,但这是一个很大的变量,但将REACT_APP_ 添加到每个变量名称前REACT_APP_API_KEY= "secret_key_here"。如果不添加REACT_APP_,您将收到undefined 问题。
      • 现在,您可以简单地使用这个变量process.env.REACT_APP_VARIBALE_NAME。例如:const API_KEY = process.env.REACT_APP_API_KEY
      • 终于,我们解决了这个悲惨的情况?。

      【讨论】:

        【解决方案11】:

        在 CREATE REACT APP 中使用环境变量的步骤

        • 在项目的 root 文件夹中创建一个名为 .env 的新文件(不是 在 src 文件夹中,而是上一层。记住,它应该与 package.json 处于同一级别(这非常重要

        • 像这样定义你的变量(注意你定义的每个变量都应该以 REACT_APP_ 开头)

          例如:.env file

          REACT_APP_ACCESS_KEY=8Sh9ZLwZevicWC-f_lmHvvyMu44cg3yZBU

          注意:您不必将值括在"" or ''

        • 现在您可以像这样在任何组件中使用该变量

          const apiKey = process.env.REACT_APP_ACCESS_KEY

          名称应与 .env 文件中给出的键匹配

        • 现在在您尝试之前,请始终记住重新启动本地服务器。一旦你运行npm start,它就可以工作了。每当您对 .env 文件进行更改时,此步骤都适用。我们通常会忘记这一步,因此它可能不起作用。

        • (可选)检查.env 条目是否存在于.gitignore 文件中。如果 .gitignore 中存在 .env 的条目,那么您的 .env 文件将不会被推送到 github(这就是我们首先使用 .env 的原因)。

        【讨论】:

          猜你喜欢
          • 2020-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多