最近有感觉到,随着系统模块数量的增加,wepack
编译打包的速度越来越慢,于是我想给项目做一下优化升级,也借此机会系统地学习一下webpack4
。
升级过程
当前版本
1 | "dependencies": { |
目标版本
1 | "dependencies": { |
第一步
升级webpack
到4.39.3
版本,npm run dev
遇到了报错……
npm run dev报错
webpack-dev-server版本过低
1 | Error: Cannot find module 'webpack/bin/config-yargs' |
应该是webpack
与webpack-dev-server
版本不符,于是升级webpack-dev-server
到3.8.0
版本。
webpack-cli缺失
1 | The CLI moved into a separate package: webpack-cli |
webpack4
将webpack-cli
单独分离出来了,因此提示我们安装webpack-cli
,那就直接安装吧。
html-webpack-plugin版本问题
1 | 10% building 2/2 modules 0 active(node:8596) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead |
考虑是html-webpack-plugin
版本问题,升级至3.2.0
extract-text-webpack-plugin?
1 | 10% building 2/2 modules 0 active(node:19732) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead |
查到是因为extract-text-webpack-plugin
不再支持webpack4.3
,需要改用mini-css-extract-plugin
。
ps: extract-text-webpack-plugin
是用来抽取依赖的.css
文件的,防止样式全部打包在js bundle
里太大。改用了mini-css-extract-plugin
后,该报错并未消除,考虑要用compiler
钩子重写一些东西,先在这埋个坑,后面弄明白了再来填坑。
eslint-loader升版本
1 | Module build failed (from ./node_modules/eslint-loader/index.js): |
升级eslint-loader
file-loader升版本
1 | Module build failed (from ./node_modules/file-loader/dist/cjs.js): |
升级file-loader
npm run build报错
改用splitChunks
1 | webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead. |
使用webpack4
的optimization.splitChunks
替代CommonsChunkPlugin
vue-loader升版本
1 | ERROR in ./src/App.vue?vue&type=style&index=0&id=7c362b6c&lang=scss&scoped=tr (./node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-0!./node_mods/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&id=62b6c&lang=scss&scoped=true&) |
考虑是vue-loader
版本问题,先升级vue-loader@15.7.1
babel-loader降版本
1 | ERROR in ./src/main.js |
把babel-loader@8
降低了版本,调整为babel-loader@7
ps: 想了一下,觉得可能其他的loader
版本也会过低,于是将其他的loader
都进行了升级,具体见package.json。
优化打包速度
happypack
一个号称用多进程策略提升webpack
打包速度的插件,真的挺管用的。
happypack允许您并行转换多个文件,从而加快了webpack的构建速度。
安装:
1 | npm install --save-dev happypack |
简单配置如下:
1 | const HappyPack = require('happypack') |
总结
经过大量npm
包版本的调整,以及webpack
配置的修改(主要是optimization
的调整;把extract-text-webpack-plugin
换成了mini-css-extract-plugin
;加入了happypack
),报错基本上消除了,经测试,dev
和prod
环境都没有功能上的问题,热加载,编译,打包速度确实得到了显著提升。
热加载
速度得到了显著提升,之前改一行代码,热加载编译的时间差不多要花
1min
,让人难受;优化后,基本上控制在<=5s
webpack
升级前打包:1
2
3Hash: 35f207120dd3736758dd
Version: webpack 3.10.0
Time: 95987ms大概需要
96s
的打包时间。webpack
升级后打包:1
2
3Hash: fb73468076752cad58f6
Version: webpack 4.39.3
Time: 61597ms打包时间降低到
61.6s
,节约了34.4s
,打包效率提升了35.8%
以上。使用
happypack
后:1
2
3
4
5Happy[1]: Version: 5.0.1. Threads: 4
Happy[1]: All set; signaling webpack to proceed.
Hash: a635e8b39b7064adf41c
Version: webpack 4.39.3
Time: 41047ms打包时间降低到
41s
,再次节约了20.6s
!总共节约了55s
,与升级前相比,打包效率提升了57%
以上。
当然可优化的空间还很大,webpack4
还有很多东西值得我们去折腾,优化之路还在继续!
扫一扫下方小程序码或搜索Tusi博客
,即刻阅读最新文章!