Resource Timing 的 bufferFull 事件需主动监听并清空缓冲区,防止性能数据丢失;浏览器默认缓冲区仅150条,应早期注册事件、扩容缓冲区、及时提取并上报关键资源耗时,辅以 onload 和动态资源兜底采集。
解析
的
事件,核心是主动监听并及时清空缓冲区,避免新资源记录被丢弃。浏览器默认的资源时间缓冲区容量有限(通常为150条),一旦写满,后续资源加载将不再被记录——这会导致关键性能
数据丢失
,尤其在单页应用或资源密集型页面中尤为明显。
监听 resourcetimingbufferfull 事件
该事件在缓冲区即将溢出时触发,必须提前注册监听,且建议在脚本早期(如
中)执行:
使用
主动扩大缓冲区(例如设为 250),但不能无限增大,需权衡内存开销
通过
设置回调,或更推荐的
方式(兼容性更好、支持多次绑定)
回调中应立即调用
提取当前全部资源记录,再调用
清空缓冲区,为后续资源腾出空间
提取并上报资源性能数据
获取到的
对象包含完整阶段耗时(如
、
、
等),需结构化处理后再上报:
过滤掉非关键资源(如 favicon、beacon 请求),聚焦 JS/CSS/图片/API 等影响首屏和交互的资源
计算关键指标:DNS 查询时长(
)、TCP 连接耗时、TTFB(
)、资源总加载时长(
)
上报建议采用
,确保页面卸载前也能发出数据,避免因跳转或关闭导致丢失
补充兜底策略防漏采
仅靠
监听不足以覆盖所有场景,还需叠加其他机制:
在
或
后主动调用一次
,捕获已加载资源
对动态插入的资源(如懒加载图片、异步组件 JS),在插入后短延时(如
)再采集,确保 timing 数据已写入缓冲区
监控
中的
和
,识别跨页面跳转导致的 timing 上下文重置,避免误判白屏或加载异常
不复杂但容易忽略
Resource TimingbufferFullwindow.performance.setResourceTimingBufferSize(n)performance.onresourcetimingbufferfull = handleraddEventListener('resourcetimingbufferfull', handler)performance.getEntriesByType('resource')performance.clearResourceTimings()PerformanceResourceTimingconnectStartresponseEnddurationdomainLookupEnd - domainLookupStartresponseStart - requestStartdurationnavigator.sendBeaconbufferFullwindow.onloadDOMContentLoadedgetEntriesByType('resource')setTimeout(..., 100)performance.timingnavigationStartfetchStart