前言
升级webpack4,一定要去看文档,特别是更新说明,不要自持用过原本webpack就自己开始折腾。折腾到后面,可能就默默流下眼泪了。
webpack4的变化
webpack-cli抽离
webpack-cli被单独拆了出来,使用的时候如果只是全局装了CLI,直接执行的时候是可以的。
webpack --config ./config/webpack.dev.js如果是写在npm hook里面会发现有点问题:
//package.json "scripts": { "dev": "webpack --config ./config/webpack.dev.js" } //shall npm run dev 此时就会给提示:
One CLI for webpack must be installed. These are recommended choices, delivered as separate packages: - webpack-cli (https://github.com/webpack/webpack-cli) The original webpack full-featured CLI. - webpack-command (https://github.com/webpack-contrib/webpack-command) A lightweight, opinionated webpack CLI. We will use "npm" to install the CLI via "npm install -D". Which one do you like to install (webpack-cli/webpack-command):如果是我没有全局装,我肯定会意识到要选一个,这个坑关键是我全局装了。所以就在那折腾半天。
其实官方文档开头就说明了。
npm install webpack webpack-cli --save-dev安装完成之后,继续执行发现有warning:
WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment. You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/mode规则
配置规则:必须在production 和 development之间选择一种,以便webpack 使用相应模式的内置优化
- production支持所有类型的优化已生成最优bundles
- development允许注释、提示和eval devtooldevtool的差别可以参考这里
- production不支持watching、development针对快速增量重建进行了优化
- production支持 module concatenating(Scope Hoisting)即作用域提升,可以将模块打包在一个函数里,这样减少了函数声明,文件体积也会减小。详细参考看这里
- process.env.NODE_ENV被设置用来区分环境(仅仅在构建代码而非config里面)
- 有一个hidden none mode的模式可以禁用所有内容
用法:
-
配置文件中:
module.exports = { entry: Entrys, mode: 'development' } -
cli 参数传入
webpack --mode=development两种方式都是可行的,不过我遇到过一个很坑的问题,困扰自己好几天,最后知道真相的自己眼泪掉下来后面再提这个问题。
零配置快速开始
因为一直被吐槽配置太累,加上parcel给的压力,webpack4也支持零配置打包了。
如果没有配置文件,会默认以./src/index.js作为entry开始打包。
如果配置了webpack.config.js或者指定了--config 的文件路径,则依据对应配置文件开始。
问题表现
在webpack.config.js中配置了entry、mode等相关属性,配置文件如下:
module.export = { mode:'production', entry:{ app:'./src/test.js', index:'./src/test.js' }, output: { path: process.cwd() + '/dist', filename:
