5月27日 21:13
Astro 的 Image 组件如何优化图片加载?
Astro 的 Image 组件在构建时自动完成四件事:生成多尺寸响应式图片、转换现代格式(AVIF/WebP)、压缩质量、注入懒加载属性。浏览器根据 srcset 和 sizes 选择最合适的资源,避免加载冗余像素。
基本用法
astro--- import { Image } from 'astro:assets'; import hero from '../assets/hero.jpg'; --- <Image src={hero} alt="首页横幅" widths={[400, 800, 1200]} sizes="(max-width: 768px) 100vw, 50vw" formats={['avif', 'webp', 'jpeg']} />
widths 配合 sizes 让窄屏加载小图、宽屏加载大图。formats 按优先级尝试,AVIF 不可用时回退 WebP,再回退 JPEG。
关键属性速查
- widths / sizes — 响应式断点与显示尺寸,缺一不可
- quality — 压缩质量,推荐 75-85,肉眼无损但体积显著降低
- loading — 首屏图用 eager + priority,其余默认 lazy
- format — 输出格式,默认 WebP
远程图片处理
远程 URL 需在 astro.config.mjs 白名单域名,否则构建报错:
javascriptimage: { remotePatterns: [{ protocol: 'https', hostname: 'cdn.example.com' }] }
不确定尺寸时加 inferSize,Astro 会在构建时拉取图片获取宽高,避免 CLS 布局偏移。
三个常见坑
- public 目录图片不走优化 — 必须放 src/assets 并 import 引入
- 宽高缺失导致 CLS — 本地图片自动推断,远程图片需手动指定或用 inferSize
- 忘记配 remotePatterns — 远程图片直接报错,排查时先检查配置
追问
Image 和 Picture 有什么区别? Picture 生成
构建时优化和 CDN 实时优化怎么选? 构建时优化零运行时开销,适合静态站点;图片量大或频繁更新时,CDN 实时处理更灵活。两者可以结合使用。
如何优化 LCP? 首屏图片设 loading="eager" 并加 fetchpriority="high",同时用 widths 限制首屏图的最大尺寸,避免加载不必要的大图。