只下载图片进缓存,不触发渲染;图片是否显示取决于标签的src设置、显隐控制及路径一致性,二者独立,缓存命中需url字节级完全相同。

rel="preload" 只负责把图片下进缓存,不触发渲染、不自动显示——你得自己控制 <img> 标签的显隐和加载时机。
为什么 preload 后图片没立刻显示
因为 <link rel="preload"> 和 <img> 是两个独立节点:前者只下载,后者才渲染。浏览器不会因为预加载了 /assets/hero.jpg,就自动把页面里某个 <img src="/assets/hero.jpg"> 立刻画出来。
常见错觉来源:
- 误以为 preload = 自动展示(实际它连 DOM 都不生成)
- 预加载路径和
<img src>不一致(大小写、斜杠、query 参数差一点,缓存就不命中) - 图片标签本身加了
loading="lazy"或display: none,压制了渲染
用 onload 事件控制显隐最可靠
监听 <img> 的 load 事件,是唯一能准确知道“这张图真正在浏览器里 ready 了”的方式。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 必须在设置
src前绑定onload和onerror,否则缓存命中时事件同步触发,回调直接跳过 - 推荐用 CSS class 控制初始隐藏(如
.js-pending { display: none; }),比内联style更易维护 - 不要只依赖
window.onload:它等所有资源(JS/CSS/iframes)完成,而图片往往早于它们就绪
示例:
@@##@@
<script>
const img = document.querySelector('.js-pending');
img.addEventListener('load', () => img.classList.remove('js-pending'));
img.addEventListener('error', () => {
console.warn('图片加载失败:', img.src);
img.style.display = 'none';
});
</script>
避免 display: none 导致 eager 加载被推迟
部分浏览器(尤其是 Safari 和旧版 Chrome)对 display: none 的 <img class="js-pending" src="/assets/hero.jpg" alt="首屏大图"> 会延迟发起请求,哪怕你写了 loading="eager" —— 这会让 preload 白做。
- 如果必须初始隐藏,改用
opacity: 0; visibility: hidden;+position: absolute;占位,确保元素仍在渲染流中 - 或用
width: 0; height: 0; overflow: hidden;,比display: none更安全 - 确保该
<img>在 DOM 中位置靠前(比如放在<main></main>开头),浏览器解析到就立即触发请求
WebP fallback 场景下怎么保证快速显示
如果你预加载的是 WebP,但 <img> 用 srcset + type fallback 到 JPEG,那 preload 的 WebP 缓存大概率不会被复用。
- 要么只预加载最终会被使用的格式(推荐 WebP,且确保
<picture></picture>中它确实是首选) - 要么放弃 preload,改用
<img>+loading="eager",靠浏览器原生 eager 加载机制 - 检查 Network 面板:Initiator 应为
img(不是(Other)),Priority 显示High或Medium,且 Size 栏标为from disk cache或from memory cache
真正卡顿的点,往往不在“要不要 preload”,而在于“preload 的 URL 和最终 src 是否字节级一致”以及“显隐逻辑是否绕过了浏览器的渲染抑制机制”。这两处一错,再快的预加载也白搭。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










