Performance 面板里 LCP 元素是客服挂件那个圆形图标,时间 3.4 秒,正文大图 1.6 秒就画完了,指标却按挂件算。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,挂件脚本写在 window.onload 里注入,要等图片和字体全部加载完才执行,注入后那个 64 像素的图标又成了新的候选元素。LCP 只看最后一次大元素绘制,挂件来得越晚指标越难看。

「客服挂件 onload 注入」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。改完顺手把文档补一句,省得下次自己重新推一遍。

new PerformanceObserver((l) => {
  const e = l.getEntries().at(-1);
  console.log(e.element, e.startTime);
}).observe({ type: 'largest-contentful-paint', buffered: true });

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,用 PerformanceObserver 把 LCP 的 element 打出来,确认到底是不是挂件,别凭感觉改;把注入时机挪到 DOMContentLoaded 之后,再用 requestIdleCallback 包一层,别和首屏抢主线程;服务端只输出一个空容器,图标的宽高先写死,避免注入时引起一次布局位移。

最后用这个标准收尾,刷新三次,LCP 元素不再是挂件,时间回到 1.8 秒以内。

作者 9823189