[英]how can we use environment variables properly with env.config.js file in react.js(i got undefined after reload)
当我使用npm run start
运行项目时,它在重新加载我的 env.config.js 给未定义变量后工作正常我遇到了 env-config.js 文件的问题。 我在下面这样实现
应用程序.js 文件
import "./App.css";
function App() {
const Query = window._env_.REACT_APP_QUERY;
console.log(Query);
return (
<div className="App">
<h1>hello world</h1>
</div>
);
}
export default App;
这是env-config.js 文件
window._env_ = {
REACT_APP_GRANT: "grate",
REACT_APP_CLIENT: "simple",
};
最后是 package-json 文件中的脚本
"scripts": {
"start": "chmod +x .\\env.sh && cp env-config.js .\\public/ && .\\env.sh && react-scripts start",
"dev": "chmod +x ./env.sh && ./env.sh && cp env-config.js ./public/ && react-scripts start",
"test": "react-scripts test",
"eject": "react-scripts eject",
"build": "react-scripts build"
},
我不知道脚本中提到的这个文件,然后我将它复制到这里env.sh
#!/bin/bash
# Recreate config file
rm -rf ./env-config.js
touch ./env-config.js
# Add assignment
echo "window._env_ = {" >> ./env-config.js
# Read each line in .env file
# Each line represents key=value pairs
while read -r line || [[ -n "$line" ]];
do
# Split env variables by character `=`
if printf '%s\n' "$line" | grep -q -e '='; then
# tollerate = surrounded by blanks: ' = '
varname=$(printf '%s\n' "$line" | sed -E 's/^([a-zA-Z_-]+) *= *(.*)$/\1/')
varvalue=$(printf '%s\n' "$line" | sed -E 's/^([a-zA-Z_-]+) *= *(.*)$/\2/')
fi
# Read value of current variable if exists as Environment variable
value=$(printf '%s\n' "${!varname}")
# Otherwise use value from .env file
[[ -z $value ]] && value=${varvalue}
# Append configuration property to JS file
echo " $varname: \"$value\"," >> ./env-config.js
done < .env.local
echo "}" >> ./env-config.js
我正在使用 git bash 终端和npm run start
命令运行我的项目
我不想为某些变量使用 .env 文件,因为我无法使用 docker 构建命令覆盖
我们如何在重新加载项目后获取 env-config.js 变量而不会出现未定义。
我不再确定env.sh file
我无法理解他们之前编码的内容,甚至不知道它的用途
脚本中的注释告诉你它在做什么。 它删除env-config.js
文件,使用window._env_
变量中的.env
文件中的变量重新创建它。 因此,如果您没有.env
文件,则不会向window._env_
变量添加任何变量。
我建议你删除env.sh
并使用dotenv
npm package: https://www.npmjs.com/package/dotenv
dotenv
npm i dotenv
.env
文件REACT_APP_GRANT=grate
REACT_APP_CLIENT=simple
env-config.js
文件中使用dotenv
import * as dotenv from "dotenv";
// dotenv reads the .env file and adds the variables in
// there to process.env
dotenv.config()
window._env_ = {
REACT_APP_GRANT: process.env.REACT_APP_GRANT,
REACT_APP_CLIENT: process.env.REACT_APP_CLIENT,
};
成功!
如果您设置这样的变量: REACT_APP_GRANT=newgrant npm run start
,默认情况下, dotenv
不会覆盖newgrant
中的.env
。 如果您使用docker run --env REACT_APP_GRANT=newgrant myapp
,我相信在 docker 命令行中设置变量时同样会起作用
编辑:
显然, reactjs 已经使用dotenv
,因此您可能不需要安装它。 您需要做的就是创建.env
文件并将REACT_APP_
前缀添加到您的变量名称中,就像您已经在做的那样。 然后您可以通过process.env.REACT_APP_MY_VAR
访问它们,就像我在示例中所做的那样。
阅读更多https://create-react-app.dev/docs/adding-custom-environment-variables/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.