代码之家  ›  专栏  ›  技术社区  ›  Blankman

从我的react应用程序中的环境变量加载值不起作用

  •  1
  • Blankman  · 技术社区  · 6 年前

    在我的react app(使用create react app)中,我有一个constants.js文件,其中包含以下常量:

    export const API_ROOT = process.env.REACT_APP_API_ROOT || 'http://www.example.com.com:4000/api';
    export const APP_ROOT = process.env.REACT_APP_APP_ROOT || 'http://app.example.com:3001';
    

    出于某种原因,即使我已经在服务器上定义了env变量,也不会在我的服务器上发现这个问题。我改变了周围的值,只是想看看这些值是从哪里获取的。

    API_ROOT=http://dev.example.com/api
    APP_ROOT=http://app.example.com
    REACT_APP_API_ROOT=http://www.example.com:3002/api
    REACT_APP_APP_ROOT=http://app.example.com:3002
    

    我不确定命名约定,所以我定义了上面的4个。 当我推到服务器时,我仍然看到api_根和app_根值是默认值,即不是来自env变量:

      http://www.example.com.com:4000/api
      http://app.example.com:3001
    

    我通过登录到服务器并验证存在env变量来进行验证:

    echo $API_ROOT
    echo $REACT_APP_API_ROOT
    

    从env变量中获取值时,我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hai Pham    6 年前

    process.env 是环境通过nodejs提供的全局对象。因为浏览器中没有nodejs,所以无法理解 process.env.API_ROOT . 初始化应用程序时使用 react-create-app 具有 webpack 默认包含,因此我建议您使用 .env 通过使用设置环境变量的文件 dotenv .

    注释 : dotenv 包含在 create-react-app v0.2.3 更高

    1. 创造 Env 文件包括

      API_ROOT=http://dev.example.com/api
      APP_ROOT=http://app.example.com
      REACT_APP_API_ROOT=http://www.example.com:3002/api
      REACT_APP_APP_ROOT=http://app.example.com:3002
      
    2. 配置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)
          ]
        };
      

    参考文献:

    希望这会有所帮助。