记一次打包优化过程,从5M到150kB,7秒到200毫秒

547 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天

最近发现公司有两个项目的首屏加载速度很慢,第一次打开网页要10S左右,这怎么能忍,于是下定决心查一查是什么原因,先打开f12看看到底是哪个请求耗时多

第一个项目有张图片有1.9M,耗时竟然占了8.94S,这个必须优化

第二个项目打包出来的JS文件竟然一个5.8M一个3M,加起来耗时用了12s,罪魁祸首就是它两了

优化结果

先看下最后的优化结果

image.png

我是从打包后的压缩图片压缩文件两个方面进行优化的,整个过程如下

方案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是打开的

image.png

于是productionSourceMap设置成false试试,我猜大概率是这个导致

image.png

以为胜利就在前方了,发现打出来的包chunk.libs依旧很大,压缩前10772KB,压缩后2827KB

所以再继续检查vue.config.js的配置,发现配置了devtool

查了下官网对于devtool的介绍

image.png

devtoolproductionSourceMap类似,都是是用来在生产中定位源码的,我们把sourceMap设置为false的同时,devtool也注释掉,重新打包试试

果然,chunck.lib包变小了,加载速度也得到了飞跃

image.png

问题解决了,也要知其所以然,所以整理了下devtoolproductionSourceMap的具体区别

image.png

以上,完成了对项目的打包优化,从而提高了首屏加载的速度,实现了5.8M到169kB,7秒到200毫秒

当然这还不是最优的,还有其他的方案比如组件库按需引入,使用CDN等,毕竟优化这条路没有最好,只有更好~

原创文章,记录成长,也希望对你有帮助!喜欢请点赞哦~

作者:前端小小梦

主页:了解更多,点击个人主页