返回博客
Cloudflare R2图片优化Next.js

把摄影图片放上网站之前:为什么需要一条 R2 图片流水线

从真实需求拆开看:原图太大、访问端不一样、内容数据要稳定,所以先把摄影图处理成可上传、可展示、可追踪的资产。

·约 470 字

昨天给摄影集补了一条脚本流水线:本地原图进 photos/raw,脚本处理出 WebP 版本,再上传到 Cloudflare R2,最后生成 content/gallery/*.yaml 给页面读取。

这个需求看起来像"上传图片",实际拆开后有三件事。

需求一:原图不能直接上网页

相机或手机原图通常很大,一张照片可能几 MB 到几十 MB。直接让网页加载原图,会把首屏、流量和移动端体验一起拖慢。

所以我没有把原图提交到仓库,也没有让页面引用原图。仓库只保留结构化内容数据,真实图片交给 R2。

需求二:同一张图要服务不同场景

摄影页至少有三种访问场景:

  • 网格列表需要小图,优先快。
  • 弹窗预览需要中等清晰度,优先均衡。
  • 查看原图需要更大尺寸,优先细节。

这就是脚本里三档输出的来源:thumb.webpdisplay.webpfull.webp。它们不是随便压三遍,而是把用户实际路径拆开:先看列表,再点开,再决定是否看大图。

需求三:内容层要可重复生成

图片上传后,页面还需要标题、宽高、拍摄时间、相机参数、URL、模糊占位图等信息。手填这些字段又慢又容易错。

因此处理脚本会写一份 manifest,再由生成脚本转成 YAML。页面只读取 YAML,不关心本地文件在哪里,也不需要知道 R2 的上传细节。

小结

这条流水线的核心不是"省一次手动上传",而是把摄影图从一堆零散文件变成稳定资产:有尺寸、有地址、有元数据,也能被 Next.js 的内容系统可靠消费。