【发布时间】:2020-08-11 03:23:52
【问题描述】:
我正在构建一个 React 16.13.0 应用程序。我想为每个环境配置不同的端点,所以我在一个组件中设置了它,src/containers/FormContainer.jsx,...
class FormContainer extends Component {
static DEFAULT_COUNTRY = 484
static REACT_APP_PROXY = process.env.REACT_APP_PROXY
...
我想在本地构建我的生产项目。但是在本地我已经定义了这个变量
localhost:client davea$ echo $REACT_APP_PROXY
http://localhost:9090
在我运行“npm run-script build”之后,我注意到它已编译到我的构建文件中......
(function(e){return e.json()})).then((function(t){console.log(t),n=t.map((function(e){return e})),e.setState({provinces:n})}))}}]),t}(n.Component);S.DEFAULT_COUNTRY=484,S.REACT_APP_PROXY="http://localhost:9090"
有什么办法不让 React 自动解析环境变量,而是从生产环境中获取它?也许我需要调整我的构建脚本?以下是我的 package.json 文件中定义的内容...
localhost:client davea$ cat package.json
{
"name": "client",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.4.0",
"@testing-library/user-event": "^7.2.1",
"bootstrap": "^4.4.1",
"jquery": "^1.9.1",
"react": "^16.12.0",
"react-bootstrap": "^1.0.0-beta.17",
"react-dom": "^16.12.0",
"react-native-flash-message": "^0.1.15",
"react-router-dom": "^5.1.2",
"react-scripts": "3.3.1",
"typescript": "^3.8.3"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"proxy": "http://localhost:8000",
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
【问题讨论】:
-
在生产环境中,JS 在您的用户的浏览器中运行,它无法访问他们机器上设置的环境变量。您从该构建中部署的只是静态 HTML、CSS 和 JS 文件。
-
哦,对了,所以当人们为生产构建 React 应用程序时,他们总是在生产应用程序的生产机器上构建它们吗?
-
理想情况下,他们在干净的 CI 环境中构建它们。我不认为诸如设置 REACT_APP_ env vars 或 Angular 的 environment 功能之类的构建时配置选项特别有用;它们意味着您必须为要部署到的每个环境创建单独的构建。相反,目标是拥有一个已知良好的资产,您可以在不同环境之间实际推广。
-
你会推荐什么策略来为每个环境设置不同的端点(env vars,因为没有更好的词)?
-
有几种方法。 Here's 我的同事写的一篇。为此,我还使用了服务器端包含,或者只是换出了捆绑中排除的特定 JS 文件。您还可以完全避免使用服务发现模式或相对路由(使用反向代理或类似 Cloud Foundry 的 path routing)的需要。
标签: reactjs npm environment-variables npm-scripts