在生产模式,为了保护这些敏感变量,我在“public_html”文件夹外创建了一个名为“other”的文件夹。
在这个“其他”文件夹中,我创建了一个名为“.env”的文件,其中包含我的各种变量,所有变量都按照建议的“REACT_APP_”开头。
为了在我的代码中访问这些变量,我导航到“其他”文件夹并使用以下命令访问 .env 文件:
require('dotenv').config({ path: '../other/.env' });
const ww = process.env.REACT_APP_COCO
但是,当我运行 npm run build 命令将应用程序部署到生产环境时,出现以下错误:
“突破性变化:webpack < 5 used to include polyfills for node.js core modules by default. This is no longer the case. Verify if you need this module and configure a polyfill for it. If you want to include a polyfill, you need to: - add a fallback 'resolve.fallback: { "os": require.resolve("os-browserify/browser") }' - install 'os-browserify' If you don't want to include a polyfill, you can use an empty module like this: resolve.fallback: { "os": false }"
我修改了“webpack.config.js”文件,特别是“resolve.fallback”,将“path”的值设置为 false 等,但没有任何效果。
所以,我决定通过创建一个新的应用程序来简化
import React from 'react'
const Home = () => {
return (
<div>
{process.env.REACT_APP_COCO}
</div>
)
}
export default Home
至此,我的webpack没有问题和错误,显示值8。
当我想在我的主机服务器上托管这个应用程序时,问题就出现了。
所以,我加了一个区分开发环境和生产环境的条件
import React from 'react'
if(process.env.NODE_ENV==='production'){
require('dotenv').config({ path: '../other/.env' });
}
const Home = () => {
return (
<div>
{process.env.REACT_APP_COCO}
</div>
)
}
export default Home
然后我运行了“npm run build”命令,得到了错误:
“编译失败。找不到模块:错误:无法解析'fs' ……./node_modules/dotenv/lib”.
然后我尝试使用以下代码修改“webpack.config.js”文件:
module.exports = {
// ...
resolve: {
fallback: {
"fs": false,
"os": false,
"path":false
},
},
plugins: [
new webpack.ProvidePlugin({
process: 'process/browser',
}),
],
};
但我仍然得到同样的错误。我一直在寻找解决方案三个多小时,但找不到。这是一个阻塞问题,因为我需要访问包含我的 .env 文件的“其他”文件夹,该文件包含我使用 Google 地图所需的 API 密钥。 我已经尽可能地简化了问题,以便您可以有效地帮助我。我急切地等待着你的建议,因为我被困住了,找不到解决方案。
Drarig29 解决方案 =>
我做了什么:
const Dotenv = require('dotenv-webpack');
module.exports = {
resolve: {
fallback: {
"fs": false,
"os": false,
"path":false
},
},
// ...
plugins: [
new Dotenv({
path: process.env.NODE_ENV === 'production' ? '../other/.env' : '.env',
})
],
};
我得到同样的错误:
找不到模块:错误:无法解析 '.......node_modules/dotenv/lib' 中的 'fs'
您不能在 Webpack 中单独使用
dotenv
,因为它使用文件系统在运行时读取文件。这在浏览器中是不可能的。
您应该改用dotenv-webpack(您可以卸载
dotenv
,因为dotenv
包含在dotenv-webpack
中)。
您需要将此插件添加到您的
webpack.config.js
(docs).
有了这个插件,你不会再在你的代码中做任何
require('dotenv').config()
,而是在webpack.config.js
中做。
要在生产环境中加载不同的文件,您可以执行以下操作:
plugins: [
new Dotenv({
path: process.env.NODE_ENV === 'production' ? '../../path/to/other.env' : '.env',
})
]
这是一个看起来不错的教程:https://prateeksurana.me/blog/using-environment-variables-with-webpack/
一旦配置正确,
process.env.{variable_name}
的所有使用都将替换为生成的包中 {variable_name}
的实际值。