我是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中获取,也可以从环境变量中获取。
谢谢。
答案 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')
);