正文中间嵌了一个广告位 iframe,加载方式是同步的,里面的脚本还要再拉两个第三方资源。CrUX 里 INP 780 毫秒,点击目录锚点经常要等一秒才有反应。
一开始怀疑是「锚点跳转的滚动逻辑被第三方脚本抢了执行顺序」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。iframe 在主线程上同步初始化,阻塞了首屏交互。也可能是广告脚本没有设 sandbox,与主页面共享事件循环。
不容易想到的是,广告脚本在 load 事件里又注入了一段同步执行的代码。
第一件事是确认 iframe 的加载时机
document.querySelectorAll('iframe').forEach(f => console.log(f.loading, f.src))
再往下改成懒加载并加 sandbox
<iframe src="https://ad.example.com/slot" loading="lazy" sandbox="allow-scripts"></iframe>
随后把广告位挪到首屏之外
.ad-slot{content-visibility:auto;contain-intrinsic-size:600px;}
复测交互延迟
npx lighthouse https://www.example.com/post/1 --only-categories=performance
别只看报错消失,验证要多做一步。改懒加载后同一锚点点击的响应降到 90 毫秒,INP 分位数值三周后落到 200 毫秒以内,广告曝光量未受影响。
第三方 iframe 一定要设 loading=lazy 与 sandbox,广告位放在首屏内会持续拉低交互指标,收益和代价要算清楚。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
