mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1284 字
3 分钟
WebP vs AVIF 实战指南:如何在真实项目里做图片格式选型
2025-06-16

前端性能优化里,图片通常是最大头。 很多站点把 JS 和 CSS 优化到极致,却仍然卡在 LCP(最大内容绘制),根因常常是首屏大图体积过高。

WebP 和 AVIF 都能明显降低图片体积,但如果只看“谁更小”,你很容易做出错误决策。 这篇文章从工程角度给出完整方案:如何选、怎么落地、如何回归验证。

1. 先统一目标:你要优化什么指标#

图片优化不是为了“文件小”,而是为了真实体验:

  • LCP:首屏大图加载速度
  • CLS:图片尺寸占位是否稳定
  • TTFB 之后的首屏渲染路径
  • CDN 出口流量成本

如果你在做商业站点,还要考虑:

  • 构建时间是否可控
  • 图片处理链路是否稳定
  • 运维复杂度是否可接受

2. WebP 和 AVIF 的核心差异#

2.1 压缩率#

  • 在同等主观画质下,AVIF 通常比 WebP 更小。
  • 但不同图像类型差异很大:
    • 照片类:AVIF 优势通常更明显。
    • 图标/平面插画:WebP 已经足够优秀。

结论:AVIF 往往更省带宽,但不是所有图都必须 AVIF。

2.2 编码与构建成本#

  • WebP 编码速度通常更快,CI/CD 压力更低。
  • AVIF 编码更耗 CPU,尤其在批量处理大图时,构建耗时会显著增长。

如果你的项目每日多次构建,且图片频繁更新,要优先评估 AVIF 带来的构建成本。

2.3 浏览器兼容与回退策略#

现代浏览器对 AVIF 和 WebP 支持已经很完整,但工程上仍应保留回退方案。

推荐做法:AVIF -> WebP -> JPG/PNG 三层回退,使用 <picture>

<picture>
<source srcset="/img/hero.avif" type="image/avif">
<source srcset="/img/hero.webp" type="image/webp">
<img
src="/img/hero.jpg"
alt="站点首页主视觉"
width="1200"
height="630"
loading="eager"
decoding="async"
>
</picture>

这段代码同时解决两件事:

  • 让高能力浏览器拿到更小资源
  • 让不支持新格式的环境稳定降级

3. 什么时候选 WebP,什么时候优先 AVIF#

你可以直接用下面这套决策逻辑:

  • 页面首屏关键图(Hero 图)
    • 首选 AVIF(质量可接受前提下)
    • 同时保留 WebP 和 JPG 回退
  • 中小尺寸内容图
    • WebP 作为默认选项,性价比高
  • 后台管理系统或内部工具
    • 优先 WebP,降低构建和维护复杂度
  • 用户上传图片量很大
    • 先统一 WebP,再对热点资源追加 AVIF

工程目标不是“全站 AVIF”,而是“在收益最高的位置用 AVIF”。

4. 实战:用 Sharp 批量生成多格式#

如果你是 Node 项目,Sharp 是最稳的路线之一。

npm i -D sharp

示例脚本(scripts/image-build.mjs):

import fs from 'node:fs/promises';
import path from 'node:path';
import sharp from 'sharp';
const inputDir = 'img/source';
const outputDir = 'img/optimized';
await fs.mkdir(outputDir, { recursive: true });
const files = await fs.readdir(inputDir);
for (const file of files) {
const inputPath = path.join(inputDir, file);
const ext = path.extname(file).toLowerCase();
const base = path.basename(file, ext);
if (!['.jpg', '.jpeg', '.png'].includes(ext)) continue;
const image = sharp(inputPath).rotate();
await image
.clone()
.webp({ quality: 78 })
.toFile(path.join(outputDir, `${base}.webp`));
await image
.clone()
.avif({ quality: 52, effort: 4 })
.toFile(path.join(outputDir, `${base}.avif`));
await image
.clone()
.jpeg({ quality: 82, mozjpeg: true })
.toFile(path.join(outputDir, `${base}.jpg`));
}
console.log('image build done');

这份参数不是绝对标准,但适合大多数博客/内容站作为初始值。

5. 避免“图片变小但体验变差”#

以下是常见反模式:

  1. 只压缩,不裁剪: 你把 3840px 大图压成 AVIF,但页面只显示 800px,仍然浪费带宽。
  2. 忽略尺寸占位: 没有写 width/height,导致图片加载时页面抖动(CLS 上升)。
  3. 首屏图片懒加载: 首屏主图设置 loading="lazy" 会拖慢 LCP。
  4. 一刀切质量参数: 所有图统一质量值,可能造成局部明显糊图。

正确做法是:先区分场景,再按场景设置参数。

6. CDN 与边缘优化策略#

如果你使用 Cloudflare、CloudFront、Fastly 等 CDN,可以结合以下策略:

  • 根据 Accept 头自动协商格式
  • 首屏关键图做多尺寸版本(srcset
  • 对热门资源设置更长缓存周期
  • 对低访问图使用更保守编码策略,减少构建成本

这能把“构建侧压力”与“传输侧收益”做平衡。

7. 一套可执行的上线流程#

  1. 选 3 张高流量页面图片作为试点。
  2. 生成 AVIF/WebP/JPG 三格式并接入 <picture>
  3. 对比上线前后 7 天数据:
    • 页面 LCP
    • 图片总流量
    • 错误率和兼容反馈
  4. 如果结果稳定,再扩展到其他页面。

不要一次性重构整个站点,先用小样本跑通闭环。

8. 给博客站点的简化建议#

如果你维护的是 Jekyll 或轻量博客:

  • 封面图和正文大图:三格式回退
  • 小图标:优先 SVG
  • 截图类教程图:优先 WebP(文字边缘更清晰)
  • 每篇文章控制图片总量,避免“图太多导致正文价值稀释”

总结#

WebP 和 AVIF 不是对立关系,而是组合关系。

  • WebP:稳定、快、够用,适合默认策略。
  • AVIF:体积优势明显,适合关键资源和高价值页面。

先从核心页面做增量优化,再逐步扩展,才是长期可维护的性能策略。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

WebP vs AVIF 实战指南:如何在真实项目里做图片格式选型
https://levifree.dpdns.org/posts/webp-vs-avif/
作者
Levi
发布于
2025-06-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录