915 字
5 分钟

随机图当封面:一张 250KB,我没让它进列表

静态博客的卡片没图会很难看,随机图 API 看起来很省事。但实测那张图 250KB、Cache-Control 还是 max-age=0——如果首页 10 条卡片都挂上,一次访问就是 2.5MB。这篇算清这笔账,并给出三种封面方案的取舍。
10月24日 21:00

文章写完忘了配图,列表卡片就空一块。随机图 API 看起来很诱人:image: random 一行配置,每篇文章自动有张不一样的封面。我实测了一下那张图,最后决定不把它放进列表。

三种封面方案#

方案做法代价
手写静态封面每个 public/assets/images/posts/<slug>/cover.webp每篇文章要多做一张图
构建期生成用脚本按标题生成(我做过 封面生成器)要写脚本,风格统一但缺少变化
运行时随机图image: random,浏览器去第三方接口取别人的服务器 + 别人的体积

本站的模板支持第三种:image: random 时,卡片渲染的不是一个本地文件,而是一次外部请求。

它到底返回了多大一张图#

curl -sI https://pic.060730.xyz/ri/h/42.webp

随机图接口实测:250KB、Cache-Control 是 max-age=0

关键三行:

Content-Length: 256098                          ← 250 KB
Cache-Control:  public, max-age=0, must-revalidate
CF-Cache-Status: HIT                            ← 边缘有缓存,但浏览器每次都要问

max-age=0 意味着浏览器每次访问都要回来验证一遍。它不像我在缓存那篇里给 /_astro/ 加的 immutable —— 那张图永远处于”可能变了”的状态。

"随机封面"长这样:一张 900 宽的插画

算一笔账#

10 条卡片 × 250KB = 一次访问 2.5MB

项目数值
首页卡片数10
单张随机图250 KB
一次访问的封面流量2.5 MB
本站自己的配图(已压缩 + 长缓存)平均 70 KB

对比之下,我这 19 篇文章的 51 张配图一共 3.63 MB,全部加载一遍比首页挂满随机图还省。

而且这 2.5 MB 还有一个隐含成本:它是串行增加的——卡片进入视口才加载,用户往下滚就一直有请求打出去,而每张都不便宜。

那随机图什么时候合理#

不是不能用,而是别用在”列表默认”。我总结的边界:

  • ✅ 单篇文章的封面:一页就一张,250 KB 可以接受(还记得加 loading="lazy");
  • ✅ 工具页/画廊的占位:用户明确在看图,愿意等;
  • ❌ 首页列表的默认封面:10 张起步,成本 ×N;
  • ❌ 移动端优先的站点:2.5 MB 在 4G 上就是几秒。

真要在列表里用,正确的做法是让接口返回缩略图(比如再压到 30 KB、宽度 400),并且给它一个正常的 Cache-Control。这两件事都得改服务端,改不了就别用。

兜底:图挂了怎么办#

外部图片还有一个绕不开的问题:对方挂了或者改规则了。本站的处理是 onerror 时隐藏图片、保留文字卡片:

<img src={image} onerror="this.style.display='none'" />

这样最坏情况是”卡片没有封面”,而不是”卡片里一个破图图标”。说实话,这个兜底本身也说明了外部图片的定位:锦上添花,不是必需品。

小结#

随机图是很典型的”看起来免费”的东西:省了自己做图的工夫,代价转移到了访客的流量和你的依赖清单上。

三条结论:

  1. 列表默认不要挂 250 KB 级的随机图,成本按卡片数线性上升;
  2. 单篇封面可以接受,配上 loading="lazy";
  3. 判断标准很简单:这张图属于”内容”还是”装饰” —— 装饰性的东西不该占据首屏流量的头几名。

我现在的做法是:文章有配图就用本地压缩好的 WebP(平均 70 KB、长缓存),没有就让卡片干净地只显示文字。空一块,比 2.5 MB 划算。

这篇文章是否对你有帮助?

发现错误或想要改进这篇文章?

在 GitHub 上编辑此页

文章修订历史 (1 次)

查看变更记录
10月24日 23:18:07 c20be15

docs(baseline): 第 30 轮终检——数字更新到最终状态,补第 28~30 轮小结

随机图当封面:一张 250KB,我没让它进列表
作者
peroe
发布于
10月24日 21:00
许可协议
CC BY-NC-SA 4.0

相关文章