我在这里问了类似的问题:Webpack环境变量混乱 https://stackoverflow.com/questions/59563484/webpack-environment-variables-confusion
首先:两个选项都无关process.env.NODE_ENV
。是的,这很令人困惑,特别是因为文档提到NODE_ENV
多次。
webpack 的环境变量与 bash 和 CMD.exe 等操作系统 shell 的环境变量不同
-
--env
命令行选项基本上允许您更改值env.{some property}
所以如果你只是通过--env.production
env.NODE_ENV
将undefined
and env.production
将被设置为true
。您需要单独设置它--env.NODE_ENV=yourvalue
. 请注意,这与process.env
. env
只是作为参数传递给您导出的函数的对象webpack.config.js
.
-
--mode
webpack v4 中引入了命令行选项,您可以使用它来设置process.env.NODE_ENV
on DefinePlugin https://webpack.js.org/plugins/define-plugin/ only为 3 个值之一 -development
, production
or none
。看起来它是专门为 DefinePlugin 制作的。如果你尝试 console.log(process.env.NODE_ENV);
在你的 webpack 配置中它将是undefined
. https://github.com/webpack/webpack/issues/7074 https://github.com/webpack/webpack/issues/7074
如果您想读取这些选项,您需要从您的文件中导出一个函数而不是一个对象webpack.config.js
.
// webpack --mode=production --env.foo=bar --env.NODE_ENV=production
var config = {
entry: './app.js'
//...
};
console.log(process.env.NODE_ENV); // undefined!! unless you really set it in OS or with cross-env
module.exports = (env, argv) => {
console.log(argv.mode); // will print "production"
console.log(env.foo); // will print "bar"
return config;
};
跨环境
人们还使用cross-env
to set process.env.NODE_ENV
而且他们根本不使用 webpack 的 --env 或 --mode。
使用的唯一原因cross-env
如果您的项目中有多个配置,例如postcss.config.js
and webpack.config.js
如果您只想设置环境一次,请使用process.env.NODE_ENV
无处不在并结束它。它只是不能与DefinePlugin https://webpack.js.org/plugins/define-plugin/盒子外面。
如果您不想使用跨环境,也可以这样做:
module.exports = (env, argv) => {
process.env.NODE_ENV = argv.mode;
return config;
};
或根据 process.env.NODE_ENV 设置模式:
var config = {
entry: './app.js',
mode: process.env.NODE_ENV
//...
};
2021 年更新
webpack 现在添加了一个新选项--node-env
所以不需要依赖cross-env除非你在其他地方使用它https://github.com/webpack/webpack-cli/issues/2362#issuecomment-771776945 https://github.com/webpack/webpack-cli/issues/2362#issuecomment-771776945