webpack --env.production和--mode =“ production”

时间:2019-03-20 11:04:15

标签: javascript webpack

如果我错了,请更正我,但据文档了解,

--env option仅在<{1}}内用于导出功能,例如在webpack.config.js中用于访问它。

module.exports = function(env, options) {
  console.log(env); // "production"
}

,假设我的入口点为index.js,代码如下:

console.log(process.env.NODE_ENV); // undefined ???

我想知道
不管我通过process.env.NODE_ENV还是--env.production

--env.development都不会分配任何值

我想知道
webpack会根据--env

的值自动启用任何类型的优化

--mode option用于立即启用一些优化,它将设置process.env.NODE_ENV可以在我的源文件中访问,例如

console.log(process.env.NODE_ENV); // "production" OR "development", etc ???

我想知道
process.env.NODE_ENV将被分配给从webpack.config.js内访问它的任何值

我想知道
假设我使用以下命令$ webpack --mode="development"

运行webpack

我有webpack.config.js的以下内容:

module.exports = {
  devtool: 'source-map'
};

因此,devtool选项最终是否会设置为eval(如果我没有在devtool中重新定义webpack.config.js,或者值将是{{1} },那么它会被我的source-map文件中的文件重写吗?

1 个答案:

答案 0 :(得分:5)

我在这里问了类似的问题:Webpack environment variables confusion

首先:这两个选项与process.env.NODE_ENV无关。是的,这特别令人困惑,因为文档多次提及NODE_ENV

webpack的环境变量与bash和CMD.exe等操作系统外壳的环境变量不同

  • --env命令行选项基本上允许您更改env.{some property}的值,因此,如果您只是传递--env.production env.NODE_ENV将是undefined并且env.production将设置为true。您需要使用--env.NODE_ENV=yourvalue单独设置它。 请注意,这与process.env 没有关系。 env只是作为参数传递给从webpack.config.js导出的函数的对象。

  • Webpack v4中引入了
  • --mode命令行选项,您可以使用它来将process.env.NODE_ENV 仅在DefinePlugin上设置为以下选项之一值-developmentproductionnone。看起来它是专门为DefinePlugin制作的。如果您尝试在Webpack配置内进行console.log(process.env.NODE_ENV);,则将为undefinedhttps://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来设置process.env.NODE_ENV,他们根本不使用webpack的--env或--mode。

使用cross-env的唯一原因是,如果您的项目中有多个配置,例如postcss.config.jswebpack.config.js,而您只想设置一次环境,请使用{{1} }并完成它。开箱即用,DefinePlugin根本无法使用。

如果您不想使用交叉环境,也可以这样做:

process.env.NODE_ENV

或基于process.env.NODE_ENV设置模式:

module.exports = (env, argv) => {
  process.env.NODE_ENV = argv.mode;

  return config;
};