是否可以在 React 项目中使用 dotenv?

IT技术 javascript reactjs webpack
2021-03-10 13:01:41

我正在尝试设置一些环境变量(用于对 dev/prod 端点进行 API 调用,密钥取决于 dev/prod 等),我想知道使用 dotenv 是否可行。

我已经安装了 dotenv,我正在使用 webpack。

我的 webpack 条目是main.js,所以在这个文件中我放了require('dotenv').config()

然后,在我的 webpack 配置中,我把这个:

  new webpack.EnvironmentPlugin([
    'NODE_ENV',
    '__DEV_BASE_URL__'  //base url for dev api endpoints
  ])

然而,它仍然是未定义的。我怎样才能正确地做到这一点?

5个回答

很抱歉提出旧问题,但
react-scripts实际上幕后使用了dotenv库。

使用 react-scripts@0.2.3 及更高版本,您可以通过以下方式使用环境变量:

  1. 在项目的根目录中创建.env文件
  2. 那里设置以REACT_APP_开头的环境变量
  3. 通过process.env.REACT_APP_...在组件中访问它

.env

REACT_APP_BASE_URL=http://localhost:3000

应用程序.js

const BASE_URL = process.env.REACT_APP_BASE_URL;

有关更多详细信息,请参阅文档

用于 API 密钥是否危险,这些变量不会编译并在生产中公开吗?
2021-04-21 13:01:41
谢谢 Dmitry,对于尝试过但没有立即工作的人,只需重新启动您的 React 应用程序。
2021-05-10 13:01:41
@ArielFrischer 这里是一个很好的详细答案:stackoverflow.com/questions/46838015/...
2021-05-10 13:01:41
另一个注意事项,自己安装 dotenv 并初始化它似乎把事情搞砸了。
2021-05-13 13:01:41
如果我们在 中使用nodemon和存储值nodemon.js,我们必须重新启动服务器。Nodemon 在文件更改时自动重新加载将不起作用,并且值不会存储在 process.env 中
2021-05-20 13:01:41

最简洁的答案是不。浏览器无法访问本地或服务器环境变量,因此 dotenv 无需查找。相反,您在 React 应用程序中指定普通变量,通常在设置module中。

可以让 Webpack 从构建机器中获取环境变量并将它们烘焙到您的设置文件中。但是,它实际上是在构建时而不是运行时替换字符串。因此,您的应用程序的每个构建都会将值硬编码到其中。然后可以通过process.env对象访问这些值

var nodeEnv = process.env.NODE_ENV;

此外,您可以使用DefinePluginfor webpack,它允许您根据构建目标(dev、prod 等)明确指定不同的值。请注意,您必须将JSON.stringify所有值传递给它。

new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}),

这适用于任何类型的公共细节,但绝不能用于任何类型的私钥、密码或 API 机密这是因为烘焙的任何值都是可公开访问的,如果它们包含敏感细节,则可能被恶意使用。对于这类事情,您需要编写一些服务器端代码并​​构建一个简单的 API,该 API 可以使用机密与 3rd 方 API 进行身份验证,然后将相关详细信息传递给您的客户端应用程序。您的服务器端 API 充当中介,保护您的秘密,同时仍能获取您需要的数据。

有点。您对您的用户进行身份验证,但您也可以使用您的 API 代理其他 API。因此,所有 API 请求,甚至是对 Google API 的请求,都可能是通过您的服务器的代理。客户端只会关心你的 API 以及它是否通过它进行了身份验证。
2021-04-22 13:01:41
我在我的回答中添加了如何做到这一点的解释。简短的回答是编写一个服务器端应用程序,您的客户端应用程序可以与之交谈并在其中执行所有私人/秘密的事情。
2021-05-02 13:01:41
谢谢。对于 API 密钥之类的东西,我该如何做到这一点?例如,谷歌地图 API 密钥。我的意思是,我想可以公开这个,因为只有一个域来源被列入白名单。但无论如何只是好奇。泰!
2021-05-12 13:01:41
此答案应替换为更受欢迎的答案作为正确答案。
2021-05-12 13:01:41
谢谢。对不起,如果这听起来很愚蠢,但你的意思是像我现在所做的那样 - 我的后端(快速应用程序)有一个 /api-auth 端点,它通过 JWT 发送,然后存储在 LS 中。我使用它,如果它有效(否则刷新它),以便客户端需要担心获取有效令牌来访问任何 api 响应/数据。
2021-05-17 13:01:41

实际上,您可以在带有 webpack 的 React 应用程序中使用 dotenv。此外,有几种方法可以做到这一点。但是,请记住,它仍然是构建时配置。

  1. 与上面的答案类似的方法。您导入dotenvwebpack 配置并使用 DefinePlugin 将变量传递给您的 React 应用程序。.env可以在此博客中找到有关如何根据当前配置注入文件的更完整指南

  2. 使用dotenv-webpack插件个人觉得真的很方便。假设您有环境:dev,stagingprod您可以为每个环境(创建.ENV文件.env.dev.env.staging等等)。在你的 webpack 配置中,你需要为环境选择一个正确的文件:

    const Dotenv = require('dotenv-webpack');
    
    module.exports = (env, argv) => {
        const envPath = env.ENVIRONMENT ? `.env.${env.ENVIRONMENT}` : '.env';
    
        const config = {
            ...
            plugins: [
                new Dotenv({
                    path: envPath
                })
            ]
        };
    
        return config;
    };
    

当您为特定环境构建应用程序时,只需将环境名称传递给 webpack:

webpack --config webpack.config.js --env.ENVIRONMENT=dev
  1. 创建 .env 文件
    API_URL=http://localhost:8000
    
  2. 安装 dotenv npm 包
    $ npm install --save-dev dotenv
    
  3. 配置 webpack 添加环境变量
    const webpack = require('webpack');
    const dotenv = require('dotenv');
    
    module.exports = () => {
      // call dotenv and it will return an Object with a parsed key 
      const env = dotenv.config().parsed;
    
      // reduce it to a nice object, the same as before
      const envKeys = Object.keys(env).reduce((prev, next) => {
        prev[`process.env.${next}`] = JSON.stringify(env[next]);
        return prev;
      }, {});
    
      return {
        plugins: [
        new webpack.DefinePlugin(envKeys)
      ]
    };
    
  4. 很好!享受 React 和 dotenv。

我刚刚在源文件夹中创建了一个 config.json:

{
    "api_url" : "http://localhost:8080/"
}

然后在我需要的文件中要求它

const config = require('./config.json');

并使用了 config.api_url

但这并不能回答 Dotenv 是否可以用于 react 项目的问题
2021-04-29 13:01:41