我一直试图在React中加载环境变量,但似乎无法弄清楚。我尝试了多种方法:
使用dotenv-webpack
软件包加载它们
webpack.config.dev.js
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(),
],
});
.env
API_HOST=http://localhost:8000
REACT_APP_API_HOST=http://localhost:8000
将其直接传递到package.json
脚本上:
"start": "webpack-dev-server --config ./webpack.config.dev.js"
在webpack命令上使用.env
webpack --env.API_HOST=http://localhost:8000
使用webpack.environmentPlugin
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代码中访问process.env
变量时,我得到undefined
对我可能做错的任何想法吗?
答案 0 :(得分:1)
您需要正确指定webpack配置文件。您将需要为dev创建一个单独的配置。 (webpack.config.dev.js)
此处为示例。
scripts: {
"dev": "webpack --env.API_HOST=http://localhost:8000 --config webpack.config.dev.js"
}
此外,您需要使用Webpack.DefinePlugin。
plugins: [
...
new webpack.DefinePlugin({ `process.env.API_HOST`: JSON.stringify(${env.API_HOST}) })
]
或者您可以使用reduce使它更全面。
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 :(得分:1)
当我想为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文件中使用它时,我将其用作:
const config = {
apiKey: process.env.REACT_APP_API_KEY,
}
为确保我针对暂存环境(Firebase项目)进行开发,我已将package.json更改为:
"scripts": {
"start": "react-app-env --env-file=staging.env start",
},
希望有帮助!
答案 2 :(得分:0)
同意@Philip的回答,这就是我构造dev.config.js
...
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
}),
]
我还使用better-npm-run
来管理我的package.json
,在这里您可以轻松地管理env
变量
"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"
}
},
希望这些信息对您也有帮助!
答案 3 :(得分:0)
我为此找到了一个简单的解决方案。您需要安装'dotenv-webpack',然后将此配置添加到您的Webpack配置中:
const Dotenv = require('dotenv-webpack');
...
plugins: [
new Dotenv(),
],
...
.env
DB_HOST=127.0.0.1
DB_PASS=foobar
S3_API=mysecretkey
最后,您可以在应用程序中访问环境变量
console.log(process.env.DB_PASS);
从文档中:DB_HOST和S3_API的.env值未包含在我们的捆绑包中,因为它们从未在代码中引用(如process.env。[VAR_NAME])。 希望对您有帮助!
答案 4 :(得分:0)
您可以在package.json
脚本部分中指定环境变量:
{
...
"scripts": {
"start": NODE_ENV=development webpack-dev-server
},
...
}