在为基于create-react-app的项目运行npm build之后,在运行时读取环境变量

时间:2018-07-18 12:07:43

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

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

在项目中,有一些对API服务器的提取调用,该URL是可配置的。在开发中,我可以通过在文件.env(例如REACT_APP_API_URL = http://somewhere/)中的环境变量中进行设置并将其导入代码中来实现此目的。

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

我想问一下“ npm build”之后是否有任何方法可以为代码提供一些配置,最好是可以从文件或.env中获取,也可以从环境变量中获取。

谢谢。

2 个答案:

答案 0 :(得分:1)

环境变量在构建步骤中已嵌入文件中,因此在调用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",
}

答案 1 :(得分:0)

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

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