我在编译脚本中定义了几个环境变量,但是,我只能从webpack.config.babel.js文件访问这些变量,我需要在react代码(前端)中访问这些变量。
我在这里找到了一种方法:https://blog.container-solutions.com/deploying-configurable-frontend-web-application-containers,但我不认为这将是一个好主意,把 meta标记数据,如数据库密码,例如.尽管,试图只做的方式.env文件它不工作给我:(
因此,我的问题是,如何从前端访问环境变量?
编辑I:
我已经应用了@robi932的明智建议,但它对我不起作用:(
webpack.config.babel.js
plugins: [
new HtmlWebpackPlugin({
template: "./src/client/index.html", //where is our template
filename: "../index.html", //where we are going to put our index.html inside the output directory
minify: {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
}
}),
new MiniCssExtractPlugin({
filename: "css/bundle.css",
minify: {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
}
}),
new webpack.DefinePlugin({
URL_FEB_API: JSON.stringify(process.env.URL_FEB_API)
})
我定义了const URL_FEB_API,以便稍后在react-js代码中使用它,但是当我尝试访问它时,它不起作用:(
console.log("HomeLF1Content process.env.URL_FEB_API: " + URL_FEB_API);
或
console.log("HomeLF1Content process.env.URL_FEB_API: " + process.env.URL_FEB_API);
这是我在package.json中编译的脚本:
"clean": "rm -rf ./dist",
"compile-dev": "NODE_ENV=development URL_FEB_API=http://localhost:4000/api/feb/graphiql webpack -d --config ./webpack.config.babel.js --progress",
"dev": "npm run clean && npm run compile-dev && cross-env NODE_ENV=development nodemon --exec babel-node src/server/server.js --ignore ./src/client"
我哪里做错了?
解决方案:
感谢@Shubham Jain给予的链接https://medium.com/@trekinbami/using-environment-variables-in-react-6b0a99d83cf5,最终我找到了一个很好的解决方案来定义前端的环境变量。
然后,我将解释我解决问题所遵循的步骤。
**首先,**每个环境需要两个.env文件。现在,我们有两个环境:开发和生产。因此,.env.development将是用于配置所有开发变量的文件,而.env将是用于配置所有生产变量的文件。
第二个,要选择之前创建的文件之一,我们需要告诉节点要编译哪个文件,因此在编译脚本中,我们必须定义一个名为NODE_ENV的变量,我们将在该变量中使用“development”或“production”进行初始化。
- 开发脚本:*
"clean": "rm -rf ./dist",
"compile-dev": "NODE_ENV=development webpack -d --config ./webpack.config.babel.js --progress",
"dev": "npm run clean && npm run compile-dev && cross-env NODE_ENV=development nodemon --exec babel-node src/server/server.js --ignore ./src/client",
- 生产脚本:*
"clean": "rm -rf ./dist",
"compile": "NODE_ENV=production webpack -p --config ./webpack.config.babel.js --progress",
"start": "npm run clean && npm run compile && cross-env NODE_ENV=production babel-node src/server/server.js --ignore ./node_modules",
第三个,现在,我们将向webpack.config.babel.js文件添加一些代码,以便根据NODE_ENV变量的值选择环境变量。
import webpack from "webpack";
import path from "path";
import dotenv from "dotenv";
import fs from "fs";
/**
* Code to get the values of environment variables during compilation time for the front-end
*/
//Get the root path. Our .env files and webpack.config.babel.js files are in the root path
const currentPath = path.join(__dirname);
const basePath = currentPath + "/.env";
// We're concatenating the environment name to our filename to specify the correct env file!
const envPath = basePath + "." + process.env.NODE_ENV;
// Check if the file exists, otherwise fall back to the production .env
const finalPath = fs.existsSync(envPath) ? envPath : basePath;
// Set the path parameter in the dotenv config
const fileEnv = dotenv.config({ path: finalPath }).parsed;
// reduce it to a nice object, the same as before
const envKeys = Object.keys(fileEnv).reduce((prev, next) => {
prev[`process.env.${next}`] = JSON.stringify(fileEnv[next]);
return prev;
}, {});
第四个,在webpack.config.babel.js文件中,在plugin部分,我们必须在编译项目时添加对这些变量的访问:
plugins: [
//With this entry we can get access to the environment variable for front-end
new webpack.DefinePlugin(envKeys),
],
最后,要在前端访问这些变量,我们可以使用process.env.VARIABLE_NAME
轻松访问它们,其中VARIABLE_NAME是在文件.env或. env. development中定义的变量之一。
请投票给@Shubham Jain给予的答案,因为他的链接对我非常有用。
6条答案
按热度按时间nszi6y051#
有一个非常简单的方法来做到这一点:
第一步:转到应用程序的根文件夹并创建一个名为. env的文本文件。
第二步:在新文件中创建自定义变量。“创建React应用程序(CRA)”会在每个自定义变量上强制使用前缀REACT_APP。请注意,在绑定过程中将忽略不带前缀的变量。
第三步:将它们分配给变量,将它们打印到屏幕等,但它们在Javascript文件中是只读的。
第四步:有一个名为NODE_ENV的内置环境变量。您可以从process.env.NODE_ENV访问它。此变量根据您当前所处的模式而更改。当您运行npm start时,它等于“development”,当您运行npm test时,它等于“test”,而当你运行npm run build时,它等于'production'。这个变量很特殊,因为它可以用来根据你的模式访问不同的环境配置。例如,如果您的生产和开发使用不同的数据库(通常是为了防止干扰),则可以使用它来有条件地访问某些变量。您无法手动重写NODE_ENV这一事实可以防止开发人员意外地将开发版本部署到生产。
第五步:打开.gitignore文件。我喜欢把.env和其他环境变量放在#misc下面。
为什么在遵循这些流程后仍无法正常工作?
错
对呀
注意:将敏感内容放入环境变量并不能保证它们的安全。它们在构建过程中被注入到捆绑文件中,因此任何人都可以通过检查您的文件看到它们。我发现它们最大的用途是在将代码推送到远程存储库之前隐藏信息。
mm5n2pyu2#
我的情况下,你想要直接的解决方案。有第三方库为这个称为
dotenv-webpack
。更多信息here0dxa2lsx3#
如何在React项目中配置.evn文件
1.只需创建.env文件。
1.我需要把你的配置在.env文件,像
注意:你必须提到
REACT_APP
,然后你才能提到你的标识符。它是每个.ENV变量的前缀。REACT_APP_FIREBASE_REALTIME_DB
1.把代码你喜欢的文件
3phpmpom4#
如果你来自windows,你可以使用以下方法,如果你来自linux,那么这些方法是直接的。你可能不会遇到这个问题,因为点文件在linux中是一个东西
方法1:windows中的dotenv
在Windows中访问
.env
文件中的元素时,可能需要执行此步骤然后在根文件夹中创建
.env
文件'
不是必需的,除非您有一些用空格分隔的字符串并在
main.js
文件中导入dotenv包如果你是Linux用户,你不需要dotenv包就可以运行。
方法二:通过终端的环境变量
+指令
+在powershell中
+在bash/wsl中
main.js
方法2的问题是你的env变量只在你保持终端会话打开的时候有效。一旦你关闭你的终端或者你的计算机你的env变量将会丢失。我建议你尝试创建一个脚本文件并且把它的文件名添加到
.gitignore
yyyllmsg5#
Webpack可以帮助你将变量从config发送到你的react应用程序Define插件。
请参见此处https://webpack.js.org/plugins/define-plugin/
hfyxw5xn6#