vue2应用性能优化:首屏FCP指标提升约80%


背景

一个vue2的项目,打包部署后,发现首屏加载速度慢,FCP白屏时间大约需要8s左右,从输入系统地址按下回车后,就一直转啊转啊转,加载缓慢,导致用户的体验非常不好!所以今天针对这个问题来做一些性能优化。

期望的结果就是首屏加载速度快一点,白屏时间缩短,从而提升用户体验

项目优化的方式、方向有很多。本文记录了我自己在项目中实践的一些优化操作,各项关键指标得到明显提升。

往期推荐: vue2项目dist瘦身——打包体积压缩73%、速度提升90%

性能优化的重要性

无论是在开发 Web 应用还是移动应用,优化项目和性能优化都是至关重要的。

  • 优化项目
    可以使我们更高效地组织和管理代码,提高代码质量和可读性,并确保应用程序的稳定性和可维护性
  • 性能优化
    针对性的性能优化,可以提高应用程序的响应速度、提高页面加载速度和用户体验,从而吸引更多用户并提高用户留存率。

【优化前】性能表现

image.png

优化前入口文件体积

image.png

  • 所有chunks总大小为 11.9 MB
  • 首屏使用文件大小
    chunk-vendors: 3.79 MB
    index.js:2.37 MB

图片相关

项目使用了url-loader处理图片,压缩指定大小图片,减少http请求。但是这一步处理完后发现我们的js文件体积变大了,这是因为部分图片被打包到了js中,不着急,我们接着优化。

all(12.59mb)
chunk-vendors:3.79mb
index.xxx.js: 大小 2.91mb

image.png

第三方插件优化

  • 剔除pafmake、xlsx

image.png

image.png
仔细观察我发现上面打包出的chunk里有一个pafmakexlsx 文件、我的项目是没有安装这个依赖的,仔细排查后发现是项目中使用了 amecharts库、而它就是其子依赖,其中还包含了 xlsx,我们是用不到这两个依赖的,所以要干掉他们!通过 webpackexternals 进行判断后剔除。

  • moment 优化

    image.png

    我的项目中只用到了moment的中文包、但是它默认会把所有语言都打包进来了,所以我们要剔除其他的语言包减少依赖

         plugins: [
            // 剔除moment的其他语言包
            new webpack.ContextReplacementPlugin(
              /moment[/\\]locale$/, // 替换的模块名称正则表达式
              /zh-cn/ // 替换模块的上下文路径
            ),
          ]

    这一步优化后打包:
    all(9.89mb)
    chunk-vendors:3.56mb
    index.xxx.js: 大小 2.91mb

    image.png

【优化中】的性能表现

image.png

大体积无用文件处理

image.png

image.png

仔细观察项目后发现有一个不小的json文件、还有一个文件夹下注册了很多的弹出组件,且经过排查发现这些组件在项目中是没有用到的!这里不清楚之前这里要做什么,所以这里我就先直接注释掉。

路由懒加载(关键)

仔细观察index.xxx.js文件发现很多文件是首页没有用到的页面,但是也被打包了进来,导致体积高达2.91mb
因为项目页面比较多,我对路由进行了重构,全部采用路由赖加载处理。

路由懒加载中遇到的问题

  • 使用魔法注释方式

      component: () => import(/* webpackChunkName: "[request]" */ `@/views/${path}.vue`)

    最先开始我使用这种方式,通过魔法注释加载路由。由于路由页面比较多,写了一个方法动态去生成上面这段代码,但是项目中报错提示如下:

    image.png

    项目打包后也直接报错提示找不到对应文件,反复确认过这个动态路由的路径是对的。

  • import动态引入
    尝试直接import动态引入也是不行的

      component: () => import(`@/views/${path}.vue`)

    网上也有说使用@babel/plugin-syntax-dynamic-import插件可以支持解析动态语法,我尝试后还是会报错。 如果有朋友有好的解决方法欢迎评论区指点!
    查询资料也有说 webpack4 不支持路由动态变量引入的方式。

    此时,在想要是vue3环境就好了,有专门的异步api很方便。所以这里我只好乖乖的一个一个静态去引入路由了。

所有路由赖加载方式引入改造后,此时我们打包再来看:

all(8.3mb)
chunk-vendors:3.33mb

image.png

index.xxx.js: 大小 26kb
image.png

优化后入口文件体积

  • 所有chunks总大小为 8.3 MB
  • 首屏使用文件大小
    chunk-vendors: 3.33 MB
    index.js:25.93 KB

总chunks 大小减少了 30%,首屏使用文件大小减少了 12%

【优化后】性能表现

  • 不开启gzip

image.png

image.png

  • 开启gzip

image.png

image.png

我们发现不开启gzip时,性能相比优化前也是有提升的。开启的话提升会更明显,效果更佳,具体怎么配置开启,在之前文章中也实践过,这里就略过了。

总结

经过上述操作配置后,主要指标提升结果:

  • FCP: 从 8s 提升到最快—> 1.6s,提升约80%
  • SI: 从 8s 提升到最快—> 3.7s,提升约54%
  • LCP: 从 18.3s 提升到最快—> 13.6s,提升约26%
  • TTI:从 25.9s 提升到最快—> 15.2s,提升约41%
  • TBT:从 300ms 提升到最快—> 120ms,提升约60%

总的来说通过上述一系列操作后,各方面指标还是有提升的。虽然都是一些基础的优化操作,可能你也听过,也见过,但关键的是你得在项目中运用起来。往往普通简单的东西在细节操作中稍加注意,才会在大的项目或事情中体现出细节的至关重要的作用!

本次优化之旅就先到这里,我相信肯定还有优化的空间和方向、欢迎大家评论区指点、讨论,一起学习、进步。

如果文章对你有帮助,可以点赞、评论、收藏、转发互动支持哈😀😀😀
点击链接 学习交流群(前端微信群) 加vx拉你进 前端学习交流群 让我们一起 好好学习(🐟🐟🐟)吧😎😎😎


文章作者: 尖椒土豆sss
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 尖椒土豆sss !
 上一篇
开源之旅:初次贡献与PR提交流程 开源之旅:初次贡献与PR提交流程
背景作为一名程序员,一直在公司项目上写代码,却从来没有参与过开源项目。虽然早之前了解过开源项目是什么?如何参加?但由于开源项目的规范要求严格和一些代码检查工具只是耳闻目睹,促使我望而却步。加上自己工作项目较忙、休息的时候也犯懒(主要是因为懒
2023-07-31
下一篇 
vue2项目dist瘦身——打包体积压缩73%、速度提升90% vue2项目dist瘦身——打包体积压缩73%、速度提升90%
背景随着前端技术的不断发展,网页应用程序变得越来越复杂,并且需要更多的资源来加载和运行。在使用 Vue2 构建的项目中,打包后的文件大小可能会非常大。 我的一个可视化系统项目,文件约1302个、有效代码行数约 257217行、项目整体资源算
2023-04-06
  目录
L
O
A
D
I
N
G