vue切换页面卡顿问题排查思路以及解决方案

1,928 阅读3分钟

最终方案直接跳到最后即可

1、寻找问题思路

1.1 思路一:页面内容多

页面内容多,引入了很多组件打包体积大所以加载时缓慢;

尝试解决方案:对所有项目进行了压缩

  • 压缩可以减少50%-70%的打包体积
  • 减少网络传输时间

结果:

整体加载速度上略有提升,但是切换页面还是存在卡顿问题

1.2 思路二:内存泄漏导致

发现了内存问题,此时猜测可能是内存泄漏导致页面卡顿,因为内存一直在堆积;

排查内存方案:1、memory; 2、Performance;

memory

可以分析内存快照找到内存泄漏的地方,但是经过大约2d的摸索始终未找到原因。。。。。。

Performance

Performance可以录制用户操作,从而分析每一帧存在的问题

经录制分析只能找到在点击事件上耗费了大量的时间,但是不能精准定位到问题

其实能够具体分析到是children上占用了大量时间,刚开始并未注意到

尝试解决方案:

  • 使用Object.freeer方法对大数据进行冻结,防止对不必要的数据进行proxy

并未解决切换页面卡顿问题,不适用此时情况,但是可以解决其他情况时的切换页面卡顿问题:样件管理目前数据4000+,切换BOM页面会卡顿,将数据冻结后可以明显解决这一问题,因为在切换页面时需要进行数据销毁,即浏览器的GC垃圾回收机制,数据越大回收越慢。

1.3 思路三:某个代码片段是长任务,堵塞了主页面的渲染

js是单线程的,所以一旦某个某个任务过长就会堵塞。开始对测试用例页面的代码进行删减

经过九九八十一次尝试,最终定位到高级筛选组件上,开始分析此组件,得到以下验证

  • 用户列表未采用虚拟下拉列表

    • 此组件是子组件,vue声明周期会先加载子组件

尝试解决方案:

  • 将用户下拉列表改为虚拟。

比之前略微提升

此时还是存在卡顿问题,直接将此组件删除,此时发现基本上秒切换,继续排查。。。。,开始对此组件的代码开始逐步删除,最终发现遍历formItem也会影响加载速度,而且里边有大量的判断。

尝试解决方案:

  • 改为异步组件

    • 异步组件会被单独打包成一个文件,然后异步引入,不会影响主页面渲染

此时发现切换很流畅,纵享丝滑

2、最终解决方案

  • 大数据采用虚拟下拉框
  • 第一时间不会呈现给用户的页面进行异步加载,vue的defineAsyncComponent,防止堵塞主页的渲染
  • 大数据采用Object.freere进行数据冻结,防止垃圾回收占用大量时间
  • 采用静态资源压缩,减少网络传输时间