资源时序
资源时序是性能 API 的一部分,它能够检索和分析应用程序资源加载的详细网络时序数据。例如,应用程序可以使用时序指标来确定加载特定资源(例如图像或脚本)所需的时间,这些资源可以隐式地作为页面加载的一部分,也可以显式地从 JavaScript 中加载,例如使用fetch()
API。
文档中的每个资源都将由一个PerformanceResourceTiming
条目(扩展PerformanceEntry
接口)表示,其entryType
为"resource"
。
对于每个PerformanceResourceTiming
条目,都会记录一个资源加载时间线,其中包含网络事件(例如重定向开始和结束时间、DNS 查询开始和结束时间、请求开始、响应开始和结束时间等)的高分辨率时间戳。除了时间戳之外,还包括提供有关资源的其他信息属性,例如获取的资源的大小或启动获取的资源类型。
资源加载时间戳
图 1. 资源加载时间戳(来源)。
应用程序可以获取用于加载资源的各个阶段的时间戳。此 API 提供的时间戳为
startTime
:资源加载过程开始之前的立即时间戳。redirectStart
:启动重定向的获取的时间戳。redirectEnd
:收到最后一个重定向的响应的最后一个字节之后的立即时间戳。workerStart
:启动 Service Worker 线程之前的立即时间戳。fetchStart
:浏览器开始获取资源之前的立即时间戳。domainLookupStart
:浏览器开始对资源执行域名查找之前的立即时间戳。domainLookupEnd
:浏览器完成对资源的域名查找之后的立即时间戳。connectStart
:用户代理开始建立与服务器的连接以检索资源之前的立即时间戳。secureConnectionStart
:如果资源通过安全连接加载,则浏览器开始握手过程以保护当前连接之前的立即时间戳。connectEnd
:浏览器完成建立与服务器的连接以检索资源之后的立即时间戳。requestStart
:浏览器开始从服务器、缓存或本地资源请求资源之前的立即时间戳。responseStart
:浏览器从服务器、缓存或本地资源收到第一个响应字节之后的立即时间戳。responseEnd
:浏览器收到资源的最后一个字节之后的立即时间戳,或传输连接关闭之前的立即时间戳,以先发生者为准。
资源大小
PerformanceResourceTiming
接口具有三个属性,可用于获取有关资源的大小数据。transferSize
属性返回获取的资源的大小(以字节为单位),包括响应标头字段加上响应有效负载主体。
encodedBodySize
属性返回从获取(HTTP 或缓存)接收到的有效负载主体的大小(以八位字节为单位),在移除任何应用的内容编码之前。decodedBodySize
返回从获取(HTTP 或缓存)接收到的消息主体的大小(以八位字节为单位),在移除任何应用的内容编码之后。
其他属性
PerformanceResourceTiming
接口提供其他资源信息。请参阅参考文档以获取完整属性列表。
典型的资源时序指标
PerformanceResourceTiming
条目提供的信息通常用于以下计算
- 测量 TCP 握手时间 (
connectEnd
-connectStart
) - 测量 DNS 查询时间 (
domainLookupEnd
-domainLookupStart
) - 测量重定向时间 (
redirectEnd
-redirectStart
) - 测量请求时间 (
responseStart
-requestStart
) - 测量 TLS 协商时间 (
requestStart
-secureConnectionStart
) - 测量获取时间(无重定向)(
responseEnd
-fetchStart
) - 测量 Service Worker 处理时间 (
fetchStart
-workerStart
) - 检查内容是否已压缩 (
decodedBodySize
不应等于encodedBodySize
) - 检查是否命中本地缓存 (
transferSize
应为0
) - 检查是否使用了现代且快速的协议 (
nextHopProtocol
应为 HTTP/2 或 HTTP/3) - 检查正确的资源是否为渲染阻塞 (
renderBlockingStatus
)
PerformanceResourceTiming
参考页面包含用于测量所有这些指标的示例代码。通常,测量这些指标的代码如下所示
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
const request = entry.responseStart - entry.requestStart;
if (request > 0) {
console.log(`${entry.name}: Request time: ${request}ms`);
}
});
});
observer.observe({ type: "resource", buffered: true });
跨源时序信息
当CORS生效时,除非服务器的访问策略允许共享这些值,否则许多时序属性的值将返回为零。这要求提供资源的服务器发送Timing-Allow-Origin
HTTP 响应标头,其值为指定允许获取受限时间戳值的来源或来源。
从网页本身以外的来源加载资源时,默认情况下返回为 0 的属性:redirectStart
、redirectEnd
、domainLookupStart
、domainLookupEnd
、connectStart
、connectEnd
、secureConnectionStart
、requestStart
和 responseStart
。
例如,要允许https://mdn.org.cn
查看资源时序信息,跨源资源应发送
Timing-Allow-Origin: https://mdn.org.cn
管理资源缓冲区大小
如果您的网站或应用程序获取的资源超过 250 个,并且您想要记录超过 250 个PerformanceResourceTiming
条目,则需要增加资源时序缓冲区的大小。
要设置浏览器性能资源数据缓冲区的大小,请使用Performance.setResourceTimingBufferSize()
方法,要清除浏览器性能资源数据缓冲区,请使用Performance.clearResourceTimings()
方法。
要获得浏览器资源时序缓冲区已满时的通知,请侦听resourcetimingbufferfull
事件。
以下调用允许浏览器性能时间线中存在 500 个"resource"
性能条目。
performance.setResourceTimingBufferSize(500);
有关更多信息,另请参阅管理缓冲区大小。