如何排查和优化页面中的 Long Task?
最近用 Lighthouse 测速,发现有个 120ms 的 Long Task 警告,但不知道具体是哪段代码引起的。我试过在关键函数里加 console.time(),但定位不到源头。
项目里用了大量第三方库,比如 lodash 和一个图表组件,会不会是它们的问题?有没有办法用 Performance 面板精准抓到那个卡顿的函数调用栈?
下面是我简化后的初始化逻辑:
document.addEventListener('DOMContentLoaded', () => {
initChart(); // 第三方图表库
const data = _.cloneDeep(largeDataset); // 使用 lodash
renderList(data);
});
1. 用Chrome Performance面板录制,别用Lighthouse那个笼统的报告。录制时要勾选Screenshots和Web Vitals选项。
2. 重点看Main线程的火焰图,找到超过50ms的黄色长条块(那就是Long Task)。右键可以放大那个区域,会显示完整的调用栈。
3. 针对你的代码,两个嫌疑点:
-
initChart()大概率是图表库初始化开销-
_.cloneDeep处理大对象时性能感人快速优化方案:
另外告诉你个骚操作:在Performance面板里按住WASD键可以像游戏一样缩放移动时间轴,比鼠标拖动快多了。排查的时候记得把CPU throttling调到4x或6x,更容易复现问题。
如果发现确实是图表库的问题,可以试试延迟加载或者换更轻量的库。我上次把一个Echarts实例换成Chart.js,Long Task直接少了80ms。