前端与浏览器 / 进阶

主线程长任务排查:不要只看一条红色火焰图

建立可复现的性能录制流程,识别长任务中的脚本执行、强制布局、垃圾回收和第三方代码。 从用户操作出发,把脚本、样式和渲染成本归因到具体功能。

读火焰图的顺序

先找到与用户输入对应的 Event,再看从事件开始到下一次绘制之间有哪些任务。超过 50ms 的任务会标记长任务,但一个 40ms 任务在低端设备上也可能很慢。 向下展开调用栈判断是业务函数、框架更新还是第三方脚本;再检查 Recalculate Style、Layout 和 Paint 是否由脚本变更触发。

EXAMPLE / 01Long Tasks
const observer = new PerformanceObserver(list => {
  for (const entry of list.getEntries()) {
    if (Math.random() < 0.01) {
      report({ type: 'longtask', duration: entry.duration, path: location.pathname });
    }
  }
});
observer.observe({ type: 'longtask', buffered: true });

修复通常有三条路

删除不必要的工作:减少渲染节点、避免重复解析、缓存纯计算。 把工作拆开:循环按时间预算分片,让浏览器有机会处理输入和绘制。 移动工作:把可序列化的 CPU 计算放进 Worker,但要把消息复制和调度成本算进去。

最后回到真实页面检查

修复方向是删除、拆分或移出主线程