跳到主要内容
兰永重
全部文章

这个博客是怎么搭起来的

发布于
  • Astro
  • 前端

站点本体是一个 Astro 静态站,这次给预留的 /blog 路由补上了博客功能。整体不到一天的工作量,记录几个关键取舍。

技术选择:继续留在 Astro

没有引入任何前端框架,原因和当初选 Astro 一致:内容型站点不需要客户端 JavaScript,静态生成后就是纯 HTML,加载快、 SEO 天然友好。博客与项目 Case Study 的区别只是内容形态,架构上没有理由分叉。

内容与代码分离

文章放在 src/content/blog/ 下的 Markdown 文件,通过 Astro 的 Content Collections 管理,schema 定义了 frontmatter 的合法字段:

schema: z.object({
  title: z.string(),
  description: z.string(),
  pubDate: z.coerce.date(),
  tags: z.array(z.string()).default([]),
  draft: z.boolean().default(false),
})

pubDate 用 z.coerce.date(),直接写 2026-08-30 这样的字符串就能自动转成 Date 对象,省掉手写 new Date() 的解析。draft: true 的文章构建时会被排除,dev 模式下仍可预览,写未完成的文章时很有用。

发文流程就是新建一个 .md 文件,写好 frontmatter,push 之后 GitHub Actions 自动构建发布——不需要动任何路由代码。

设计上的复用

博客页没有另起一套视觉体系,全部复用站点已有的设计系统:玻璃拟态卡片、紫→靛→青的渐变强调色、chip 标签。唯一新增的是一个 .blog-post 排版容器——项目 Case Study 的 .case-study 带有 01 / 02 的自动编号标题,适合章节化叙事,但博客文章不长,编号反而累赘,所以单独写了一套不带编号的正文样式,顺带补了引用块、代码块和表格的样式。

RSS

顺手加了 /rss.xml,用 @astrojs/rss 从同一个 Content Collection 生成,文章的 tags 直接映射为 RSS 的 categories。订阅入口在博客列表页底部。