什么是 TTFB?
TTFB 是一个指标,用于衡量请求资源到响应第一个字节开始到达之间的时间。
startTime
和 responseStart
之间的经过时间。
TTFB 是以下请求阶段的总和:
- 重定向时间
- Service Worker 启动时间(如果适用)
- DNS 查找
- 连接和 TLS 协商
- 请求,直到响应的第一个字节到达
缩短连接设置时间和后端延迟时间可以降低 TTFB。
TTFB 和早期提示
103 早期提示的引入导致人们对 TTFB 衡量“第一个字节”的含义感到困惑。103 个提前提示计为“第一个字节”。finalResponseHeadersStart
是 responseStart
的额外时间条目,用于衡量要衡量的最终文档响应(通常是 HTTP 200 响应)的开始时间。
提前提示只是提前响应的一种新方法。某些服务器允许在主正文可用之前提前刷新文档响应,只包含 HTTP 标头或包含 <head>
元素,这两种方式的效果与提前提示类似。这也是所有这些都被测量为 reponseStart
和 TTFB 的另一个原因。
如果完整响应需要一些时间,提前发回数据非常有用。不过,这确实会使您难以比较不同平台或技术的 TTFB,因为它们使用的功能不同,这会影响所使用的 TTFB 衡量方式。最重要的是了解您所用工具衡量的内容,以及衡量结果会受到被衡量平台的影响。
TTFB 得分多少算好?
由于 TTFB 在以用户为中心的指标(例如首次内容渲染 [FCP] 和最大内容渲染 [LCP])之前,因此建议您的服务器快速响应导航请求,以便75 百分位数的用户获得在“良好”阈值范围内的 FCP。作为粗略的指导,大多数网站应力求 TTFB 不超过 0.8 秒。
如何衡量 TTFB
现场工具
实验室工具
- 在 Chrome 开发者工具的“网络”面板中
- WebPageTest
在 JavaScript 中衡量 TTFB
您可以使用 Navigation Timing API 在浏览器中衡量导航请求的 TTFB。以下示例展示了如何创建一个监听 navigation
条目并将其记录到控制台的 PerformanceObserver
:
new PerformanceObserver((entryList) => {
const [pageNav] = entryList.getEntriesByType('navigation');
console.log(`TTFB: ${pageNav.responseStart}`);
}).observe({
type: 'navigation',
buffered: true
});
web-vitals
JavaScript 库还可以更简洁地在浏览器中衡量 TTFB:
import {onTTFB} from 'web-vitals';
// Measure and log TTFB as soon as it's available.
onTTFB(console.log);
衡量资源请求
TTFB 适用于所有请求,而不仅仅是导航请求。特别是,由于需要设置与这些服务器的连接,托管在跨源服务器上的资源可能会导致延迟。如需衡量该字段中资源的 TTFB,请在 PerformanceObserver
中使用 Resource Timing API:
new PerformanceObserver((entryList) => {
const entries = entryList.getEntries();
for (const entry of entries) {
// Some resources may have a responseStart value of 0, due
// to the resource being cached, or a cross-origin resource
// being served without a Timing-Allow-Origin header set.
if (entry.responseStart > 0) {
console.log(`TTFB: ${entry.responseStart}`, entry.name);
}
}
}).observe({
type: 'resource',
buffered: true
});
上一个代码段与用于衡量导航请求 TTFB 的代码段类似,只不过您查询的是 'resource'
条目,而不是 'navigation'
条目。这也解释了从主来源加载的一些资源可能会返回 0
值,因为连接已打开,或者资源是从缓存中即时检索的。
如何缩短 TTFB
如需有关提高网站 TTFB 的指南,请参阅我们的优化 TTFB 深度指南。