媒体变体管线
GoPress 的媒体系统在上传阶段生成前台可直接使用的响应式图片变体,解决移动端直接加载原图导致的 LCP、总传输体积和缓存命中问题。
核心流程
后台上传 JPEG/PNG
├→ 保存原图到 uploads/YYYY/MM/{hash}.jpg
├→ 读取并写入原图 width/height 到 gp_media
├→ 生成同目录 resize 变体
│ ├→ {hash}-thumb.jpg
│ ├→ {hash}-480w.jpg
│ ├→ {hash}-768w.jpg
│ ├→ {hash}-1024w.jpg
│ └→ {hash}-1440w.jpg
├→ 如运行环境存在 cwebp,同时生成 WebP
│ ├→ {hash}-480w.webp
│ ├→ {hash}-1440w.webp
│ └→ {hash}-full.webp
└→ 写入 gp_media_variants,模板按原图 URL 自动查找 variants
关键模块
| 模块 | 责任 |
|---|---|
core/media/media.go |
原始媒体模型,保存原图 URL、mime、宽高等基础信息 |
core/media/variant.go |
MediaVariant 模型,记录每个派生图的尺寸、格式、路径、大小 |
core/media/image.go |
图片尺寸计算、resize、同格式变体写入、WebP 变体写入 |
core/media/repository.go |
FindByPath、ListVariants、UpsertVariant 等查询/维护 API |
core/admin/service.go |
上传后生成变体;删除媒体时清理变体;重建历史图片变体 |
core/theme/images.go |
responsiveImage / responsiveImagePriority / responsiveImagePreload 模板输出 |
core/engine.go |
/static/uploads/ 长缓存,带版本参数的静态资源长缓存;静态文件 GET / HEAD 一致,缺失文件返回 no-store |
存储约定
原图和变体放在同一个年月目录,方便备份、迁移和静态文件服务:
uploads/2026/04/82b1502e3773c17831542303ee65dc1e.png
uploads/2026/04/82b1502e3773c17831542303ee65dc1e-480w.webp
uploads/2026/04/82b1502e3773c17831542303ee65dc1e-768w.webp
uploads/2026/04/82b1502e3773c17831542303ee65dc1e-1024w.webp
uploads/2026/04/82b1502e3773c17831542303ee65dc1e-1440w.webp
uploads/2026/04/82b1502e3773c17831542303ee65dc1e-full.webp
公开 URL 对应为 /static/uploads/YYYY/MM/...。gp_media.path 始终指向原图,gp_media_variants.path 指向派生图。内容字段和主题设置继续保存原图 URL,不需要迁移旧内容。
模板调用
主题应优先使用核心 helper(详见 图片接入规范):
{{responsiveImage .ImageURL .Title "card-image" "(max-width: 768px) 100vw, 33vw" "lazy"}}
{{responsiveImagePriority .ImageURL .Title "hero-image" "100vw"}}
{{responsiveImagePreload (settingOr .Settings "home_hero_1_image" "") "100vw"}}
历史图片重建
生产环境已有老图无需重新上传。部署新版本并完成 AutoMigrate 后,在后台「媒体库」点击:
- 「补齐图片变体」 — 扫描
gp_media中已有 JPEG/PNG,补生成缺失变体并写入gp_media_variants。如果环境新增了cwebp,补齐任务也会为已有图片补{hash}-full.webp - 「强制重建图片变体」 — 删除并重建全部变体
生产环境依赖
Go 标准库负责 JPG/PNG decode/encode 和 resize。WebP 编码依赖系统命令 cwebp:
# macOS
brew install webp
# Debian/Ubuntu
apt-get install webp
如果运行环境没有 cwebp,系统仍会生成 JPG/PNG resize 变体,只是不会生成 WebP;模板会自动回退到非 WebP 版本。
