笔记 / 2026-10-23

给静态站点加一个媒体工作流

用 Sveltia 的图片字段把封面与图库上传到 public/media,并在 Astro 里统一解析子路径与尺寸约束。

2 分钟阅读astrocmsmedia

背景

项目案例需要真实截图,但早期封面是程序化生成的。后台可以编辑 MDX,却没有办法上传图片;即使上传,部署在 GitHub Pages 子路径下也容易把路径写错。

方案

把 Sveltia 项目 collection 的媒体目录指向 public/media/projects,封面和图库字段改成 image:

  • CMS 上传后返回 /media/projects/...;
  • 组件统一调用 ProjectMedia,自动补 BASE_URL;
  • 没有真实封面时回退到 src/assets/covers 的生成图;
  • 单文件限制 300KB、总量 8MB,由 check-media 拦截。

取舍

public/media 的图片不经过 astro:assets 的构建期优化,换来的是 CMS 预览与路径简单。图片懒加载、固定比例与体积检查仍然保留;如果以后图片量变大,再引入 Sharp 变体管线。

结果

图库与封面可以在后台完成,部署到 /dsh-personalnet/ 时路径仍然正确。没有图片的项目继续使用生成封面,不会出现空图。

实现索引

  • public/admin/cms/config.yml:image 字段与 media_folder。
  • src/components/project/ProjectMedia.astro:BASE_URL 解析。
  • scripts/check-media.mjs:体积、格式与引用检查。

命令面板

Esc

↑↓ 选择Enter 执行Esc 关闭