JA EN ZH

图像加载策略设计 - 掌握 preload、fetchpriority 和 decoding

· 9 分钟阅读

图像加载的性能瓶颈与优化方向

图像加载涉及发现、请求、下载、解码四个阶段。每个阶段都有优化空间。

加载阶段:

  • 发现:浏览器解析 HTML 发现 img 标签。预加载扫描器可提前发现
  • 请求:发起 HTTP 请求。受并发连接数和优先级影响
  • 下载:传输图像数据。受带宽和文件大小影响
  • 解码:将压缩数据解码为位图。CPU 密集,可能阻塞主线程

LCP 图像的关键路径:LCP 元素通常是主视觉图。优化其加载路径可直接改善 LCP 指标。目标:让 LCP 图像尽早被发现、高优先级请求、快速下载、异步解码。

preload - 提前发现关键图像

<link rel="preload"> 告诉浏览器尽早开始加载指定资源,即使 HTML 解析器尚未发现该资源。

用法:<link rel="preload" as="image" href="hero.webp">

适用场景:

  • CSS 背景图:浏览器需要下载并解析 CSS 后才能发现背景图。preload 可提前数百毫秒开始加载
  • JavaScript 动态插入的图像:JS 执行后才创建的 img 元素,preload 可提前加载
  • LCP 图像:确保 LCP 图像以最高优先级尽早加载

响应式 preload:

  • <link rel="preload" as="image" imagesrcset="small.jpg 400w, large.jpg 800w" imagesizes="100vw">
  • 浏览器根据视口选择合适的尺寸预加载

注意:过度使用 preload 会与其他资源竞争带宽。仅对 LCP 图像和关键 CSS 背景图使用。

fetchpriority - 精细控制加载优先级

fetchpriority 属性让开发者明确告诉浏览器资源的重要程度,影响请求的调度顺序。

取值:

  • high:高优先级。用于 LCP 图像、首屏关键图像
  • low:低优先级。用于首屏外的图像、装饰性图像
  • auto:浏览器自行判断(默认)

用法:<img src="hero.jpg" fetchpriority="high">

与 loading 属性的配合:

  • LCP 图像:loading="eager" fetchpriority="high"(不懒加载 + 高优先级)
  • 首屏装饰图:loading="eager" fetchpriority="low"(不懒加载但低优先级)
  • 首屏外图像:loading="lazy"(懒加载,fetchpriority 无意义)

效果:在带宽有限时,high 优先级的图像会先于 low 优先级的图像开始下载。可将 LCP 改善 100-400ms。

decoding 属性 - 控制图像解码时机

decoding 属性控制图像解码是否阻塞主线程渲染。

取值:

  • async:异步解码,不阻塞页面渲染。图像可能在渲染后才显示
  • sync:同步解码,确保图像在下一帧渲染前解码完成。可能阻塞渲染
  • auto:浏览器自行决定(默认)

推荐策略:

  • 大多数图像:decoding="async"。避免大图解码阻塞页面渲染
  • LCP 图像:不设置或 decoding="auto"。让浏览器优化 LCP 的解码时机
  • 动态插入的图像:decoding="async"。避免 JavaScript 插入图像时阻塞主线程

createImageBitmap 的关系:对于需要在 Canvas 中使用的图像,createImageBitmap 可在 Web Worker 中解码,完全不阻塞主线程。

综合加载策略设计

将各种加载优化技术组合为完整的策略,针对不同类型的图像应用不同的加载方式。

分层策略:

  • LCP 图像(1 张):preload + fetchpriority="high" + 不懒加载 + 响应式 srcset
  • 首屏其他图像(2-5 张):不懒加载 + fetchpriority="auto" + srcset
  • 首屏外图像:loading="lazy" + 占位(aspect-ratio 或 LQIP)
  • 装饰性图像:loading="lazy" + fetchpriority="low"

HTTP 头优化:

  • 103 Early Hints:在 HTML 响应前提示浏览器预加载 LCP 图像
  • Link: <hero.webp>; rel=preload; as=image:HTTP 头中的 preload

性能监控与验证

实施加载策略后需要验证效果,持续监控性能指标。

验证工具:

  • Chrome DevTools Network:查看图像的请求时序、优先级(Priority 列)和大小
  • Lighthouse:检测未优化的图像(未压缩、未正确尺寸、缺少懒加载)
  • WebPageTest:瀑布图可视化加载顺序,确认 LCP 图像是否最先加载

关键指标:

  • LCP:最大内容绘制时间。LCP 图像的加载策略直接影响此指标
  • CLS:累积布局偏移。懒加载图像的占位是否正确
  • Total Blocking Time:图像解码是否阻塞了主线程

RUM(真实用户监控):

  • 使用 PerformanceObserver 监控实际用户的 LCP 元素和时间
  • 按设备类型、网络条件分析图像加载性能
  • 识别特定图像导致的性能问题(如过大的未优化图像)

Related Articles

图像懒加载实现指南 - loading=lazy 与 IntersectionObserver 的选择

系统讲解图像懒加载的实现方法。对比原生 loading=lazy 和 IntersectionObserver 方案,涵盖性能优化和最佳实践。

Web 图像性能审计 - Core Web Vitals 改善实践指南

Web 图像性能审计的完整方法论。涵盖审计工具与指标、LCP 优化、CLS 防止、传输大小优化及持续监控体系。

Core Web Vitals 与图像优化 - 改善 LCP、CLS 和 INP 的实用方法

图像优化对 Core Web Vitals 的影响及改善方法。涵盖 LCP 加速策略、CLS 防止、INP 优化及懒加载最佳实践。

Web 图像优化清单 - 15 项生产环境可执行项目

面向生产环境的系统化图像优化清单,涵盖格式选择、压缩策略、响应式图片、加载策略和分发缓存等 15 个关键项目。

图像 SEO 完全指南 - 通过 Alt 文本、文件名和尺寸优化提升搜索流量

全面解析图像 SEO 优化策略,涵盖 alt 属性写法、文件命名、结构化数据、Core Web Vitals 优化和图像站点地图。

响应式图像实现指南 - srcset、sizes 与 picture 元素完全指南

响应式图像的完整实现指南。涵盖 srcset 属性、sizes 属性、picture 元素的艺术指导及构建流程中的自动化生成。

Related Terms