link rel="prefetch"预加载下一页图片是浏览器原生支持、兼容性好且语义明确的方式,需在中写绝对或根相对路径、显式声明as="image",避免相对路径404和跨域静默失败。

用 link rel="prefetch" 预加载下一页的图片
浏览器原生支持的预加载方式里,link rel="prefetch" 是最直接、兼容性较好(Chrome/Firefox/Safari/Edge 均支持)且语义明确的选择。它告诉浏览器:“这个资源我稍后很可能用到,空闲时提前拉取并缓存”。注意它不是强制立即加载,而是低优先级、在空闲网络带宽下进行。
常见错误是把图片 URL 写成相对路径但没考虑当前页面上下文,导致 404;或误用 rel="preload"(它会高优先级阻塞渲染,不适合跨页图片)。
- 在当前页面的
中添加:<link rel="prefetch" href="/next-page/banner.jpg" as="image">
-
as="image"必须显式声明,否则浏览器无法正确设置请求头(如Accept: image/webp)和缓存策略 - URL 建议用绝对路径或根相对路径(以
/开头),避免因当前页面路由层级不同导致解析失败 - 不要一次性 prefetch 太多图片(比如整页图库),可能挤占关键资源带宽;优先选下一页首屏核心图(如 banner、主商品图)
用 IntersectionObserver + fetch() 按需触发预加载
当“下一页”逻辑较复杂(比如无限滚动、SPA 路由跳转、或图片 URL 动态生成),纯 <link> 静态声明就不够用了。这时可监听用户滚动/导航行为,在合适时机用 fetch() 发起图片请求并丢进内存缓存。
关键点在于:只发请求,不插入 DOM;利用浏览器 HTTP 缓存机制,等真正渲染下一页时自动命中。
- 示例:监听用户快滑到页面底部,预取下一页首张图
const observer = new IntersectionObserver(entries => { if (entries[0].isIntersecting) { fetch('/next-page/hero.jpg', { cache: 'force-cache' }); } }); observer.observe(document.querySelector('#trigger-bottom')); -
cache: 'force-cache'确保复用已有缓存,避免重复请求;若想绕过缓存调试,临时改用'no-cache' - 务必检查响应状态:
fetch()成功不代表图片可加载,服务端返回 200 但内容为空或格式错误,后续<img src>仍会触发 404 - SPA 场景下,建议在路由
beforeEach或onBeforeRouteUpdate钩子中触发预加载,比监听滚动更精准
为什么不用 img loading="lazy" 或 CSS background-image?
loading="lazy" 只控制本页内图片的懒加载时机(离屏时不加载),对“下一页”的资源完全无感知;CSS background-image 则无法被 prefetch 正确识别——浏览器不解析 CSS 文件里的 URL 做预加载,即使写了 url(...) 也不会触发。
更隐蔽的问题是:某些构建工具(如 Webpack/Vite)会把图片转成 base64 或 hash 路径,导致你在 HTML 里写的 href 和实际产物路径不一致。这时必须通过构建后生成的 manifest 或运行时 JS 变量获取真实 URL。
- Webpack 用户:用
require('./next-banner.jpg')替代硬编码路径,确保路径正确 - Vite 用户:用
new URL('./next-banner.jpg', import.meta.url).href获取构建后地址 - 避免在 CSS 中写死下一页图片路径,除非你确认该 CSS 是同步加载且路径不会被构建工具处理
验证预加载是否生效的三个关键检查点
光写代码不验证,很容易以为成功了其实没走缓存。打开 DevTools 的 Network 面板,筛选 Img 类型,按如下顺序排查:
- 看
Status列:prefetch 请求应显示200(首次)或200 (from memory cache)/(from disk cache)(后续);若显示pending后消失,说明被浏览器取消(可能因高优先级任务抢占) - 看
Initiator列:prefetch 应为Other或link,而不是img或script—— 否则说明是图片元素自己触发的加载,不是预加载 - 切到下一页后,对应图片的请求
Size应为from cache,且耗时接近 0ms;如果仍是网络请求,大概率是 URL 不一致(大小写、斜杠、参数顺序)或缓存策略冲突(比如服务端返回了Cache-Control: no-store)
跨域图片尤其容易踩坑:若图片域名和当前页不同,prefetch 请求会带上 Origin 头,服务端需返回 Access-Control-Allow-Origin,否则浏览器静默失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











