我在做前端性能监控,想统计用户看到首屏内容的时间,但发现 performance.timing 里的 loadEventEnd 和 domContentLoadedEventEnd 都不太准,有时候 DOM 加载完但图片还没出来,用户其实还没看到内容。有没有更靠谱的方法?
我试过用 performance.getEntriesByType('navigation')[0] 拿 timing 数据,也试过监听 load 事件,但都不太符合“用户实际看到首屏”的体验。是不是得结合 FP、FCP 这些指标?具体该怎么实现呢?
现在主流的做法是用 Performance Observer 监听 Paint 相关的指标。最关键的两个是 FCP (First Contentful Paint) 和 LCP (Largest Contentful Paint)。
FCP 是首次有内容绘制的时间点,LCP 是最大内容(通常是首屏最大的图片或文字块)绘制完成的时间。如果你的首屏主要是图片,那 LCP 会更准确;如果是文字为主,FCP 就够用了。
简单实现如下:
如果你想更精细地控制"首屏"的定义,比如首屏有多个关键图片,可以手动埋点:
另外提醒一下,LCP 在移动端会因为网络、图片大小等因素有波动,建议结合 navigationStart 一起算相对时间。还有,如果你的页面有懒加载,LCP 可能会统计到非首屏的内容,这点要注意过滤。
总的来说,现在最靠谱的方案就是 LCP,Chrome 的 Lighthouse 和 Web Vitals 扩展都是用这个指标。
你说的思路是对的,得结合 FCP 和 LCP 这两个指标。用 Performance Observer 来监听最稳:
LCP 基本上就是用户看到主要内容的时间点了,比单纯等 load 事件靠谱得多。
如果你首屏有张大图特别关键,还想更精确点,可以单独监控那张图的加载时间:
在 WordPress 里的话,你可以在主题的 functions.php 里挂个钩子,把这段监控代码 enqueue 进去就行。搞个简单的插件把这段 JS 注入到 footer也成。
总的来说,LCP 是目前最接近"首屏可见"体验的指标,比以前那些 domContentLoaded 靠谱多了。