携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天
最近发现公司有两个项目的首屏加载速度很慢,第一次打开网页要10S左右,这怎么能忍,于是下定决心查一查是什么原因,先打开f12看看到底是哪个请求耗时多
第一个项目有张图片有1.9M,耗时竟然占了8.94S,这个必须优化
第二个项目打包出来的JS文件竟然一个5.8M一个3M,加起来耗时用了12s,罪魁祸首就是它两了
优化结果
先看下最后的优化结果
我是从打包后的压缩图片和压缩文件两个方面进行优化的,整个过程如下
方案1:图片压缩-手动
手动把图片在压缩网站压缩替换,看下压缩到1M会不会快一点
可以看到耗时从8.94s提高到了1.54s,竟然提高了这么多,不知道是不是网络原因,但是减小打包体积能加快加载,这个是共识的,但是手动压缩总不是办法,所以进一步优化我们需要用到图片压缩插件
方案2:图片压缩-webpack插件
使用插件image-webpack-loader对所有使用到的静态资源图片进行压缩
vue.config.js(vue-cli3)加上这个配置
chainWebpack(webpackConfig) {
// 压缩图片
webpackConfig.module
.rule('images')
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({ bypassOnDebug: true })
.end()
}
重新打包
插件会在打包时对图片进行压缩,可以看到1.9M的图片被压缩到了1.4M,虽然压缩效果不如手动压缩的好,但是插件的好处是会对所有用到的静态资源图片进行压缩,整体也是起到了打包优化的效果。
另外有各种配置,可以调整我们要压缩后图片的质量
chainWebpack(webpackConfig) {
// 压缩图片
webpackConfig.module
.rule('images')
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({
mozjpeg: { progressive: true, quality: 50 }, // 压缩JPEG图像
optipng: { enabled: true }, // 压缩PNG图像
pngquant: { quality: [0.5, 0.65], speed: 4 }, // 压缩PNG图像
gifsicle: { interlaced: false } // 压缩GIF图像
})
.end()
}
至此,图片过大导致加载慢的原因算是解决了,继续解决另一个问题:打包后JS文件过大
方案3:开启gizp压缩
我们看下是否开启了gizp
发现只有部分开启了gizp,检查下nginx配置
在location里也开启gizp on配置试试
重新发布看看
果然,都开启gizp后,element的包从5.8M减少到了902K, 耗时也从27秒降到了2.65秒, 效果还是得到了显著的提升的
细心的人可能会发现,还有一个2.9M的包chunk.libs,而且这已经是压缩后的,来看看他压缩前有多大
是的,压缩前有差不多10M,要进一步排查看是什么打出来的包
排查代码发现,vue.config.js配置有chunk.libs的配置,通过配置可以看到,chunk.libs是node_modules打出来的包,所以接下来是解决这部分的打包优化问题
方案4:关闭sourceMap
后来仔细看了vue.config.js的配置,发现productionSourceMap是打开的
于是productionSourceMap设置成false试试,我猜大概率是这个导致
以为胜利就在前方了,发现打出来的包chunk.libs依旧很大,压缩前10772KB,压缩后2827KB
所以再继续检查vue.config.js的配置,发现配置了devtool
查了下官网对于devtool的介绍
devtool和productionSourceMap类似,都是是用来在生产中定位源码的,我们把sourceMap设置为false的同时,devtool也注释掉,重新打包试试
果然,chunck.lib包变小了,加载速度也得到了飞跃
问题解决了,也要知其所以然,所以整理了下devtool和productionSourceMap的具体区别
以上,完成了对项目的打包优化,从而提高了首屏加载的速度,实现了5.8M到169kB,7秒到200毫秒
当然这还不是最优的,还有其他的方案比如组件库按需引入,使用CDN等,毕竟优化这条路没有最好,只有更好~
原创文章,记录成长,也希望对你有帮助!喜欢请点赞哦~
作者:前端小小梦
主页:了解更多,点击个人主页