Q8 · 性能指标
如何用代码获取 TBT?指标分数段?怎么提升?
⚡ 速记答案(30 秒)
- 概念:TBT = 所有 Long Task(>50ms)被阻塞时间的总和(减去 50ms 基线)
- 获取:
PerformanceObserver监听longtask,累加duration - 50 - 分数段:好 ≈ < 200ms,一般 200–600ms,差 > 600ms
- 与 TTI/FID 类似:切分长任务、减少脚本体积
- 降低渲染频率,避免频繁强制同步布局
- 尽量把重逻辑放到 Web Worker 和后端
📖 详细讲解
TBT 定义
Total Blocking Time:FCP 和 TTI 之间,主线程被长任务阻塞的总时间。
计算方式
对每个超过 50ms 的任务,计算其超出部分:
TBT = Σ(每个长任务的 duration - 50ms)优化策略
1. 识别长任务
• 使用 Performance 面板
• 使用 PerformanceObserver 监听
2. 拆分和延迟
• 代码分割
• 延迟非关键脚本
• 使用 requestIdleCallback
3. 优化执行
• 减少 DOM 操作
• 避免强制同步布局
• 使用虚拟列表
💻 代码示例
计算 TBT
let tbt = 0;
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
// 只统计超过 50ms 的部分
const blockingTime = entry.duration - 50;
if (blockingTime > 0) {
tbt += blockingTime;
console.log('新增阻塞时间:', blockingTime, 'ms');
console.log('累计 TBT:', tbt, 'ms');
}
}
});
observer.observe({ type: 'longtask', buffered: true });面试技巧:回答性能问题时,先说指标和标准,再讲优化手段,最后结合实际项目经验。