Christopher博客与作品集
创作手记约 2 分钟读完

这个博客是怎么搭起来的:Astro + EmDash

用 EmDash CMS 管理内容,用 Astro 构建静态页面,发布到 Qoder Sites。后台在本地跑,前台是纯静态——一套既好写又省心的个人站方案。

这个站点本身,就是一次「把读懂的东西做一遍」。选型的需求很简单:

  • 内容要能在后台里改,不用每次动代码;
  • 前台要快、要稳,最好是纯静态,不养服务器;
  • 数据要留在自己手里,迁移不绑架。

最后的答案是:EmDash CMS + Astro + 静态发布。

EmDash 是什么

EmDash 是一个基于 Astro 的全栈 TypeScript CMS,被称为 WordPress 的「精神续作」:文章、页面、分类、标签、菜单、媒体库、作者署名,这些 WordPress 的核心概念它都有,但全部跑在类型安全的现代地基上。

  • 数据库用 SQLite(也支持 Postgres、Turso、Cloudflare D1),一个文件就是整个内容库;
  • 后台是现成的管理界面,支持草稿、修订历史、定时发布;
  • 内容模型可以在后台里加字段,不用改代码;
  • 登录默认用 Passkey,也支持 OAuth。

关键决策:后台在本地,前台是静态

EmDash 的后台和 API 需要服务器运行时,但个人博客不想为后台养一台服务器。我的做法是:

  1. 本地 npm run dev 启动 Astro 开发服务器,后台在 /_emdash/admin,写文章、传图片、改字段都在这里;
  2. 所有前台页面标记为预渲染,构建时从 SQLite 读出内容,生成纯静态 HTML;
  3. 把静态产物发布到 Qoder Sites,前台零服务器、零数据库;
  4. 内容更新后,重新构建、重新发布即可。

这样前台拿到了静态站的全部好处——快、稳、便宜、抗造;后台拿到了 CMS 的全部好处——可视化编辑、结构化内容、修订历史。两头的好处都占了。

内容是怎么进来的

EmDash 支持 seed 文件:一个 JSON 描述整个内容模型和初始内容,数据库为空时自动应用。这个站的三门作品、六篇文章、关于页,都是这样一次性写进去的。之后在后台里改,改完导出 seed,内容就永远有一份可版本化的备份。

正文用的是 Portable Text——结构化 JSON 富文本。段落、标题、列表、引用、链接都是数据,渲染成什么样子完全由前端组件决定。换主题不用动内容,这是它比 Markdown 字符串强的地方。

值得注意的几个坑

  • EmDash 需要 Astro 的 server 输出模式来承载后台路由;前台页面用逐页 prerender 导出静态,两者不冲突。
  • 媒体存储指到 public 目录、baseUrl 配成静态路径,上传的图片才能跟着静态产物一起发布。
  • 搜索不能依赖运行时 API——构建时生成一份 JSON 索引,前端本地过滤,静态站也能用。

一句话总结

CMS 负责内容的秩序,静态负责发布的省心。

如果你也想搭一个「自己写、自己存、发出去就不管」的个人站,这套组合值得一试。