在 webpack.config.js 中获取当前的 `--mode`

Posted

技术标签:

【中文标题】在 webpack.config.js 中获取当前的 `--mode`【英文标题】:Get current `--mode` in webpack.config.js 【发布时间】:2018-08-22 19:17:24 【问题描述】:

如何在 webpack.config.js 中获取 package.json 中指定的当前--mode? (例如,用于推送一些插件。)

package.json

"scripts": 
  "dev": "webpack --mode development",
  "build": "webpack --mode production"

我在 Webpack 3 中做了什么:

package.json

"scripts": 
    "build": "cross-env NODE_ENV=development webpack",
    "prod": "cross-env NODE_ENV=production webpack"
  ,

然后,我可以使用process.env.NODE_ENV 在 Webpack 中获取环境。

当然,我可以通过NODE_ENV--mode 传递,但我更愿意避免重复。

【问题讨论】:

和你问的一样。 【参考方案1】:

试试这个

package.json

"scripts": 
  "dev": "webpack --mode development",
  "build": "webpack --mode production --env.production"

所以如果你在webpack config 中使用env,看起来像这样

module.exports = env => 
     const inProduction = env.production
     return  
        entry: ...,
        output: ...,
        module: ...
     

更多详细信息以设置您的webpack.config.js。 (Environment Variables for webpack 4)

【讨论】:

【参考方案2】:

您希望避免在脚本上传递的选项重复。

当您导出函数时,将使用 2 个参数调用该函数:环境 env 作为第一个参数和选项映射 argv 作为第二个参数。

package.json

"scripts": 
  "build-dev": "webpack --mode development",
  "build-prod": "webpack --mode production"
,

webpack.config.js

module.exports = (env, argv) => 
    console.log(`This is the Webpack 4 'mode': $argv.mode`);
    return 
        ...
    ;

这些是结果:

对于npm run build-dev

> webpack --mode development

This is the Webpack 4 'mode': development
Hash: 554dd20dff08600ad09b
Version: webpack 4.1.1
Time: 42ms
Built at: 2018-3-14 11:27:35

对于npm run build-prod

> webpack --mode production

This is the Webpack 4 'mode': production
Hash: 8cc6c4e6b736eaa4183e
Version: webpack 4.1.1
Time: 42ms
Built at: 2018-3-14 11:28:32

【讨论】:

这可行,但是,当我必须将 import/resolver 与 eslint 一起使用时,它似乎不接受函数。 对我来说,它通过使用“env.mode”来工作。第一个参数,而不是第二个。 @corvid 请检查我的回答,可能会对 webpack 解析器有所帮助。 在 Webpack 的官方文档中,他们使用 argv.mode 来获取实际模式:webpack.js.org/concepts/mode 我对您的答案投了赞成票,因为我将其设置为相等的 mode=production 而不是空格....谢谢【参考方案3】:

我最终(ab)使用npm_lifecycle_scriptDefinePlugin 中设置模式:

MODE: JSON.stringify(process.env.npm_lifecycle_script.substr(process.env.npm_lifecycle_script.indexOf('--mode ') + '--mode '.length, process.env.npm_lifecycle_script.substr(process.env.npm_lifecycle_script.indexOf('--mode ') + '--mode '.length).search(/($|\s)/)))

这会从发出的webpack 命令中获取--mode 参数的值。

【讨论】:

【参考方案4】:

为了测试是否处于生产模式,在webpack.config.js 文件中我使用这个:

const isProduction = process.argv[process.argv.indexOf('--mode') + 1] === 'production';

const config = 
    ...
;

if (isProduction) 
    config.plugins.push(new MiniCssExtractPlugin());
 else  // isDev
    config.devtool = /*'source-map'*/  'inline-source-map';


module.exports = config;

停止尝试 NODE_ENV,这是老派(webpack 3)。

这更兼容import / webpack resolver

【讨论】:

令人失望的是,这就是 Webpack 期望我们获得该模式的方式。这一点都不干净。

以上是关于在 webpack.config.js 中获取当前的 `--mode`的主要内容,如果未能解决你的问题,请参考以下文章

使用--config标志时,Webpack找不到node_modules

webpack.config.js配置文件

Vue 教程(二十七)webpack 配置文件 webpack.config.js

gem 在 Rails 上做出反应:webpack.config.js

webpack前端构建工具学习总结之webpack.config.js配置文件

webpack.config.js配置入口出口文件