PerformanceObserver 监听不到首次 paint 事件怎么办?
我在用 PerformanceObserver 监控 FP 和 FCP,但页面加载后 observer 回调根本没触发,是不是我写法有问题?
已经确认浏览器支持,也把 entryTypes 写对了,但就是收不到首次渲染的事件。
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
console.log('Paint:', entry.name, entry.startTime);
});
});
observer.observe({ entryTypes: ['paint'] });
两种解决思路:
第一种,页面早期就创建 observer,把 script 放到 head 里越早越好:
第二种,兼容已经发生的 paint,用 getEntriesByType 兜底:
实际项目里两种一起用最稳妥,兜底方案能保证不丢数据。
要优雅地解决这个问题,必须把这段监听代码放到 head 标签的最顶部,确保在 CSS 加载和页面渲染之前就执行。这样你才能在事件发生前就埋伏好。
正确的代码位置应该像下面这样:
这样改完就能正常触发了。顺便说一句,虽然现在的浏览器大多支持,但为了代码的健壮性,建议加个 if ('PerformanceObserver' in window) 的判断,这样代码看起来更严谨,也更优雅。