How to load environment variables in React
我一直试图在React中加载环境变量,但似乎无法弄清楚。我尝试了多种方法:
使用
加载它们
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | const merge = require('webpack-merge'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const template = require('html-webpack-template'); const Dotenv = require('dotenv-webpack'); const baseConfig = require('./webpack.config.base'); module.exports = merge(baseConfig, { mode: 'production', plugins: [ new HtmlWebpackPlugin({ template, inject: false, appMountId: 'app', mobile: true, lang: 'es-ES', title: 'My App', meta: [ { name: 'description', content: 'My App', }, ], }), new Dotenv(), ], }); |
1 2 | API_HOST=http://localhost:8000 REACT_APP_API_HOST=http://localhost:8000 |
直接将其传递给
1 | "start":"webpack-dev-server --config ./webpack.config.dev.js" |
在webpack命令上使用.env
1 | webpack --env.API_HOST=http://localhost:8000 |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | const webpack = require('webpack'); const merge = require('webpack-merge'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const template = require('html-webpack-template'); const baseConfig = require('./webpack.config.base'); module.exports = merge(baseConfig, { mode: 'development', devtool: 'cheap-module-source-map', devServer: { publicPath: '/', contentBase: './dist', compress: true, stats: 'minimal', overlay: true, historyApiFallback: true, port: 8081, hot: true, }, plugins: [ new HtmlWebpackPlugin({ template, devServer: 'http://localhost:8081', inject: false, appMountId: 'app', mobile: true, lang: 'es-ES', title: 'My App', meta: [ { name: 'description', content: 'React template.', }, ], }), new webpack.EnvironmentPlugin({ API_HOST: 'http://localhost:8000', }), ], }); |
这些方法都不起作用,当我尝试在React代码中访问
关于我可能做错了什么的任何想法?
当我想为Firebase项目提供设置但不将其加载到公共存储库中时,我一直在与环境变量作战。
据我所知,您需要命名您的环境变量应始终以前缀REACT_APP_开头。您可以随时随地定义它们,但是如果您使用create-react-app工具创建了应用,则可以将变量放入.env文件或其他一些文件中-(https://facebook.github.io/create -react-app / docs / adding-custom-environment-variables)
当我想创建自己的文件时,我的痛苦开始了,因为我有两个不同的Firebase项目-一个用于登台,另一个用于生产。
我最终使用了react-app-env模块,该模块有助于:
-定义我自己的文件-staging.env和production.env
-自动为我的变量加上REACT_APP_
前缀
例如:
我在staging.env文件中定义了Firebase ApiKey:
API_KEY = xxxxxxxxxxxxxxxxxxx
当我在firebase.js文件中使用它时,我将其用作:
1 2 3 | const config = { apiKey: process.env.REACT_APP_API_KEY, } |
并确保我针对暂存环境进行开发(Firebase项目),我已将package.json更改为:
1 2 3 | "scripts": { "start":"react-app-env --env-file=staging.env start", }, |
希望有帮助!
您需要正确指定webpack配置文件。您将需要为dev创建一个单独的配置。 (webpack.config.dev.js)
此处为示例。
1 2 3 | scripts: { "dev":"webpack --env.API_HOST=http://localhost:8000 --config webpack.config.dev.js" } |
此外,您需要使用Webpack.DefinePlugin。
1 2 3 4 | plugins: [ ... new webpack.DefinePlugin({ `process.env.API_HOST`: JSON.stringify(${env.API_HOST}) }) ] |
或者您可以使用reduce使它更全面。
1 2 3 4 5 6 7 8 9 10 11 | const envKeys = Object.keys(env).reduce((prev, next) => { prev[`process.env.${next}`] = JSON.stringify(env[next]); return prev; }, {}); return { plugins: [ ... new webpack.DefinePlugin(envKeys) ] }; |
您可以在
1 2 3 4 5 6 7 | { ... "scripts": { "start": NODE_ENV=development webpack-dev-server }, ... } |
我为此找到了一个简单的解决方案。您需要安装\\'dotenv-webpack \\',然后将此配置添加到您的webpack配置中:
1 2 3 4 5 6 7 | const Dotenv = require('dotenv-webpack'); ... plugins: [ new Dotenv(), ], ... |
.env
1 2 3 | DB_HOST=127.0.0.1 DB_PASS=foobar S3_API=mysecretkey |
最后,您可以在应用程序中访问环境变量
1 | console.log(process.env.DB_PASS); |
从文档中:DB_HOST和S3_API的.env值未包含在我们的捆绑包中,因为它们从未在代码中引用(如process.env。[VAR_NAME])。
希望对您有所帮助!
同意@Philip \\的答案,这就是我构造
的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ... plugins: [ new webpack.DefinePlugin({ // process.env 'process.env': { NODE_ENV: JSON.stringify(process.env.NODE_ENV), WHY_DID_YOU_UPDATE: process.env.WHY_DID_YOU_UPDATE, }, // my other global flags __CLIENT__: true, __SERVER__: false, __DEVELOPMENT__: true, __DEVTOOLS__: true }), ] |
我还使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | "betterScripts": { "dev": { "command":"concurrently --kill-others "better-npm-run watch-client" "better-npm-run start-dev" "gulp watch --gulpfile semantic/gulpfile.js"" }, "why-did-you-update": { "command":"better-npm-run dev", "env": { "WHY_DID_YOU_UPDATE": true } }, "watch-client": { "command":"node webpack/webpack-dev-server.js", "env": { "UV_THREADPOOL_SIZE": 100, "NODE_ENV":"development", "NODE_PATH":"./src", "PORT": 3000 } }, "build": { "command":"webpack --verbose --colors --display-error-details --config webpack/prod.config.js" } }, |
希望此信息对您也有帮助!