序言
webpack5即将发布,打算趁发布前踩个坑,之前从alpha版本就有关注,本次重点更新在长期缓存,tree shakking和es6打包这块,具体更新日志可以参考官方。
更新日志
- node版本更新为v10。
- webpack5默认采用es6代码进行输出,4是es5的(可通过设置output.ecmaVersion来使用es5进行打包,默认是采用es2015进行生成)。
- webpack <= 4带有许多node.js核心模块的polyfill,5去掉了这些模块,专注于与前端兼容的模块。
- 优化了打包后的文件大小
- 长期缓存(默认开启)
- 自定义json解析器
- 优化后的tree shakking (可以针对嵌套的模块进行分析,未使用将在生产模式删除)
- splitChunk和模块大小(可以针对js和css样式进行更细致的切割,并用于minSize和maxSize)
- 模块命名
- 编译器空闲并关闭(在node中使用wepback()结束后,需要手动调用compiler.close(), compiler是当前webpack实例)
环境准备
- node v10以上,官方最低8.9.0,个人v13.1.0
- webpack 5.0.0-beta.7
- webpack-cli 3.13.0
以上为我个人环境,仅供参考。
参考文章
开始踩坑
打包对比
新建一个webpack.config.js,内容如下
const path = require('path')
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].[chunkhash].js'
}
}
// package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack --mode development",
"build": "webpack --mode production"
},




现在来安装html-webpack-plugin和webpack-dev-server,让配置支持热更新和html
npm i html-webpack-plugin webpack-dev-sever -D
// package.json的配置修改为
"dev": "webpack-dev-server --mode development"
安装完成后配置变成修改成这样

然后,html-webpack-plugin给我们带来了个惊喜(报错),是不是很刺激,很意外。

yarn add html-webpack-plugin@next -D
安装完成后,重新启动我们的webpack,发现问题已经解决,项目可继续运行。然后发现编译时间太长了,目前还仅仅只有个console和一个什么都没的html页面,我们可以开启webpack的多线程,进行打包,安装terser-webpack-plugin即可,安装完后,配置如下




tree shakking
webpack5的结果


5直接把模块里面的内容打印了出来,4把变量打印了出来,共同点是都去掉了未使用的b,官方解释是webpack现在可以针对导出的嵌套模块进行访问,重新导出对象时,可以改善tree shakking,感觉应该是webpack在编译之前,提前对模块的依赖进行分析,然后做了预处理,然后编译时,把未使用的模块直接删掉。深入的就不了解了。 webpack5还开启了optimization.innerGraph,默认在生产模式启动,该选项可以针对模块的符号进行分析,从而找出导入和导入的依赖关系,相对来说,webpack4并没有这个功能。 可以针对以下内容进行分析:
- function
- class
- export default 或变量声明
- 局部变量
- 类和函数表达式
现在我们又新加了以下代码



持久缓存
webpack5新增了持久缓存,可通过以下配置开启:

模块命名id得以确定


总结
webpack5更新的内容大概来说就是这些,本次踩坑并没针对各种loader进行测试,总体来说,webpack相对4来说大小发生了质的变化,速度上来说,还是4更有优势,目前来看,至于正式版本就不清楚了。代码已经上传到github,如果有问题也可以加我Q: 2495713984。
地址:webpack5地址