【问题标题】:Reading environment variable in run time after running npm build for a create-react-app based project为基于 create-react-app 的项目运行 npm build 后在运行时读取环境变量
【发布时间】:2018-12-26 08:26:12
【问题描述】:

我是 React 新手,我将部署一个 React 项目。 React 项目由 create-react-app 创建,生产代码由“npm build”构建,由 Express 托管。

在项目中,有一些对 API 服务器的 fetch 调用,其 URL 是可配置的。在开发中,我可以通过在 .env 文件(例如 REACT_APP_API_URL=http://somewhere/)的环境变量中设置它并在代码中导入来做到这一点。

但是,似乎这些环境变量在运行“npm build”后变为静态,我无法再更改它,即使在我启动服务器时执行“REACT_APP_API_URL=http://otherserver/ node express_server.js”之类的操作。

我想问有没有办法在“npm build”之后为代码获取一些配置,最好是从文件或.env中获取,从环境变量中获取对我来说也可以.

谢谢。

【问题讨论】:

    标签: node.js reactjs express create-react-app


    【解决方案1】:

    我找到了一种从后端获取自定义 conf.json 文件并在我的 react 应用程序的 index.tsx 文件中应用参数的方法:

    const CURR_ENV = process.env.REACT_APP_ENV;
    
    console.log('ENV: ' + CURR_ENV)
    
    if (CURR_ENV === 'prod') {
        console.log("fetching conf.json ...")
        fetch('conf.json')
            .then(response => response.json())
            .then(data => {
                console.log("data=" + JSON.stringify(data))
                const amplify = data['amplify'];
                console.log("amplify=" + JSON.stringify(amplify))
                Auth.configure(amplify);
                Auth.configure(amplify);
    
                const backendUrl = data['backendUrl'];
                console.log("backendUrl=" + JSON.stringify(backendUrl))
                localStorage.setItem('backend_url', backendUrl);
                console.log("successfully configured amplify and apigw")
            })
            .catch(error => console.error(JSON.stringify(error)))
    }
    else {
        localStorage.setItem('backend_url', process.env.REACT_APP_BACKEND_URL?process.env.REACT_APP_BACKEND_URL:"");
        Amplify.configure(awsmobile);
        Auth.configure(awsmobile);
    }
    
    ReactDOM.render(
      <Router>
          <div>
              <Route path="/" component={App}/>
          </div>
      </Router>,
      document.getElementById('root')
    );
    

    【讨论】:

      【解决方案2】:

      环境变量在构建步骤中嵌入到文件中,因此您需要在调用 react-scripts build 时为它们分配正确的值。

      示例

      "scripts": {
        "start": "cross-env REACT_APP_API_URL=http://somewhere/ react-scripts start",
        "build": "cross-env REACT_APP_API_URL=http://otherserver/ react-scripts build",
      }
      

      【讨论】:

      • 感谢您的快速响应,所以,react-scripts build 完成后似乎无法导入或更改配置?
      • @wing999 遗憾的是没有。您可以让服务器将环境变量注入 HTML 文件,然后让 JavaScript 包在浏览器中加载这些全局变量时读取这些全局变量,但无法像那样动态更改实际的 JavaScript 文件。
      • 看来我需要找到其他解决方法。可能是在 Express 中设置代理以使 API 服务器的 URL 可配置。
      • @wing999 你的用例是什么?您没有为您拥有的每个不同域运行一次构建脚本的选项吗?
      • 这确实是一种选择,但我只是想看看是否可以避免重新构建所有内容。可能是因为我是一个老掉牙的程序员,认为改变一些配置的风险比重建东西要小。
      猜你喜欢
      • 2020-09-23
      • 2020-11-17
      • 1970-01-01
      • 2019-07-03
      • 2021-11-28
      • 2022-08-15
      • 2020-11-04
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多