目的
这次排查用了performance面板,但是当时并没有定位到具体的问题,这篇文章是在知道原因的情况下,去反推当时能通过performance面板排查出具体原因的步骤
问题现象
某个页面,在客户环境中,关闭时会卡顿几秒钟,但在本地的开发、测试、演示环境均是正常的
而且,只有切换页面时会出现,仅仅在页面内操作功能按钮并没有卡顿现象
排查过程
第一反应是通过performance面板录制,发现调用了很多次qe函数,而这个函数最终调用了vue的$destory
初步定论
因为这个页面比较简单,且在表格仅有几项内容时也会多次调用$destory,因此初步怀疑是有定时器。不过实际中并没有发现定时器,且页面也没有注册了destory,页面内的弹窗组件也是通过v-if显示的,因此没找到头绪
可以看到,页面卡顿的原因是script不断的执行,因此基本可以排除内存泄露的情况
同事,script的执行文件都是vue.min.js,并没有指向业务代码,因此方向又断了一条
到这里,只知道页面卡顿是由于不停的调用destory函数,我就没继续通过performance排查了。
实际上最终的原因是选择用户的下拉框,客户的用户有一万多条,destory函数就是处理这个el-option的
思考-当时应该如何通过performance排查出这个bug?
当时应该在script中打断点,在destory中查看被销毁的元素是什么类型
- 在打断点后多次执行,就能看到排除页面布局、表单的组件后,后面的大量重复的被destory元素都是
el-select-dropdown__item,基于此就能得到是select的option被大量渲染导致的卡顿
结论
排查时,可以针对重复执行的代码,打断点查看