performance.getentriesbytype("paint") 返回一个performancepainttiming对象数组,仅含"first-paint"和"first-contentful-paint"两类条目;但因浏览器支持差异、调用时机过早或隐私策略限制,常返回空数组。

performance.getEntriesByType("paint") 返回什么
它返回一个 PerformancePaintTiming 对象数组,只包含两类条目:"first-paint" 和 "first-contentful-paint"。注意:不是所有浏览器都支持这两个条目,且 "first-paint" 在部分 Chromium 版本中默认被禁用(如 Chrome 120+ 启动参数未开启时可能为空)。
为什么调用后数组为空
常见原因有三个:
-
performance.getEntriesByType("paint")必须在页面加载完成之后调用(比如window.addEventListener("load", ...)或document.readyState === "complete"),过早执行会拿不到数据 - 某些浏览器(如 Safari)不支持
"paint"类型,返回空数组是正常行为,不能当作错误 - Chrome 若以无痕模式、或启用了某些企业策略/扩展(如广告拦截器),可能屏蔽 paint timing 数据,导致
first-paint条目缺失
如何安全提取首次绘制时间(first-paint)
不能直接取 [0].startTime,因为数组顺序不保证,且条目类型可能缺失。正确做法是过滤 + 显式判断:
const paintEntries = performance.getEntriesByType("paint");
const fpEntry = paintEntries.find(entry => entry.name === "first-paint");
const fpTime = fpEntry ? fpEntry.startTime : null;
注意:startTime 是相对于 performance.timeOrigin 的毫秒数,若需相对于页面导航开始的时间,应减去 performance.navigationStart(但通常直接用 startTime 就够了,因为 timeOrigin 默认对齐导航开始)。
兼容性与替代方案提醒
如果 fpEntry 为 null,不要 fallback 到 first-contentful-paint 并改名成“首次绘制”——这是语义错误。first-contentful-paint 是内容绘制,和 first-paint(哪怕只是背景色)有本质区别。
真正需要 first-paint 的场景极少;大多数性能监控只需 first-contentful-paint。若必须采集 first-paint,建议同时检测 navigator.userAgent 是否含 "Chrome" 且版本 ≥ 90,并记录缺失原因(如 "fp-not-supported"),而不是静默忽略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











