IntersectionObserver“智能视口加载器”需结合网络状态、停留时长、资源分级与空闲调度:省流量模式或2G网络下禁用;元素在视口停留300ms且可见比>0.1才加载;链接高优、图片中优、视频/iframe低优;fetch用requestIdleCallback包裹并限并发。

直接用 IntersectionObserver 做“智能视口加载器”,核心不是让它一看到链接或图片就加载,而是让它学会判断“值不值得现在加载”。关键在于结合网络状态、用户行为和资源优先级,把带宽留给真正需要的内容。
只在合适网络下触发加载
IntersectionObserver 本身不关心网络好坏,必须手动加一层守门员。利用 navigator.connection 检测实时连接状况:
- 如果
conn.saveData === true(用户开启了“省流量模式”),跳过所有预加载 - 如果
conn.effectiveType是'2g'或'slow-2g',直接 return,不 fetch - 建议加上防抖:连续两次检测都满足条件再启用加载逻辑,避免网络波动误判
延迟确认 + 可见时长过滤
用户快速滚动时,元素可能一闪而过。盲目加载反而浪费带宽。可在 observer 回调中加入停留时间判断:
- 首次进入视口时,记录时间戳,不立即加载
- 持续观察该元素,若 300ms 内仍保留在视口内,再发起请求
- 若中途移出视口,清除定时器,放弃加载
- 对图片类资源,还可叠加
isIntersecting && intersectionRatio > 0.1,确保至少有 10% 面积可见才考虑加载
按资源类型分级加载
不是所有进入视口的资源都该被同等对待。HTML 链接、图片、视频、iframe 的带宽成本差异极大:
- 高优:仅预加载
<a href>的目标页面 HTML(轻量、提升导航体验) - 中优:图片使用
loading="lazy"原生懒加载,配合decoding="async"防阻塞渲染 - 低优/禁用:视频、iframe、第三方脚本默认不自动加载,需显式交互(如点击播放按钮)才触发
- 可为每类资源设置独立的
threshold值,比如图片设为0.05(提前一点加载),关键按钮设为0.8(更保守)
空闲时段执行 + 并发控制
即使进了视口、网络也 OK,也不能抢在用户操作时加载:
- 用
requestIdleCallback包裹 fetch 调用,确保只在主线程空闲时执行 - 限制并发请求数(例如最多同时 2 个),避免突发大量请求挤占带宽
- 对非首屏区域的资源,可叠加
setTimeout(..., 1000)延迟 1 秒再检查是否仍需加载,给首屏内容让路

















