文章 / 2026-11

为什么我用 Astro 重建了这个博客

Hugo、Hexo、Astro 三个候选的实际差别,以及把博客从平台挪回自己域名下时,我真正在权衡的东西。

开站第一篇,先说清楚这个站为什么长这样。

旧写法哪里不舒服

过去几年的技术记录散在几个平台上:掘金发长文,知乎回答问题,还有一些只在本地 Markdown 里躺着。看起来渠道很多,实际有三个问题绕不过去。

第一,内容不在自己手上。平台改规则、限流、甚至直接下架,链接说没就没。写过的东西一旦丢了外部入口,就等于没写过。

第二,写作被流量口味牵着走。平台喜欢短平快、带情绪、有结论的稿子。可我真正想记的是过程中的取舍:为什么否掉方案 A、第几轮才想明白、最后为什么留了这个坑。这类东西在平台上是负资产。

第三,没有一个稳定的身份入口。简历上贴一堆平台链接,不如一个自己的域名来得干净。

所以这次不是”再开一个号”,是把博客当自己的工程来搭。

三个候选,实际差在哪

先把结论摆出来:三个都能用,差别不在”谁更好”,而在”你以后打算拿它干什么”。

维度 Hexo Hugo Astro
运行时 Node 单二进制 Node(构建期)
构建速度 文章多了会慢 最快 快
模板体系 传统模板引擎 Go Template 组件(可混 React/Vue)
嵌交互组件 麻烦 麻烦 原生支持
中文主题 最多 多 少

Hexo 上手最快,中文主题一抓一大把,纯写 Markdown 的话几乎零成本。代价是 npm 依赖一多,隔两年升个大版本很容易炸;文章堆到几百篇,构建开始肉眼可见地变慢。

Hugo 是我认真考虑过的方案。单二进制、零依赖、上万篇也是秒级构建,稳定性几乎没得挑。卡住我的是 Go Template——写页面没问题,但我想在文章里嵌自己的小 Demo 时,就得绕着来。

Astro 赢在这里:它允许我在 Markdown 里直接放组件。

选 Astro 的三个具体理由

一、文章能带交互。 我写的东西里,有一部分光靠文字讲不清——一个消息排序的可视化、一个 Agent 调用的时序图。Astro 支持 MDX,这些可以直接写成组件塞进正文,而不是截图加一句”如图”。

二、默认零 JS。 Astro 默认输出纯静态 HTML,只有明确标记的组件才会加载脚本。这一点对博客很关键:正文页不该为了一个主题切换按钮拖着几百 KB 的框架跑。

三、Frontmatter 有类型校验。 这点很实用。每篇文章的元信息走 schema,写错字段、漏了日期,构建直接失败,而不是等线上发现某篇文章没进列表。

// src/content.config.ts
const blog = defineCollection({
  loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
  schema: z.object({
    title: z.string(),
    description: z.string(),
    pubDate: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false)
  })
});

draft: true 的文章在线上构建时会被过滤掉,本地开发仍然能预览。这个开关比我以前手动注释掉文件靠谱得多。

托管为什么换到 Cloudflare Pages

作品集继续留在 GitHub Pages——它改动频率低、页面少,和 GitHub 生态连着,面试官点进去链路顺。

博客不一样,它会长。GitHub Pages 的三个短板迟早会碰到:国内访问不稳定;每月 100 GB 的软带宽上限,一篇被转发爆了就尴尬;没有边缘函数,以后想加个访问统计或者轻量接口,扩展不了。

Cloudflare Pages 免费额度对个人博客是过剩的:无限带宽、每月几百次构建、自带 CDN 和证书。更重要的是以后能挂 Worker——搜索、订阅推送、评论这类东西,不用再额外找服务。

关键是迁移成本低。源码永远在 Git,产物只是输出。哪天觉得 Cloudflare 也不合适,换个平台重新构建一次就行,文章一篇都不会丢。这是自己托管最大的好处:托管商是可以换的。

这套结构

目录很规矩,加文章只需要往一个地方放文件:

src/
  content/blog/      # 所有文章,一个 .md 一个文件
  pages/             # 路由:首页、归档、标签、关于
  components/        # 页头、页脚、目录
  layouts/           # 页面骨架
  styles/global.css  # 设计令牌与全部样式

写一篇新文章就是新建一个 Markdown 文件,填好 frontmatter,git push,剩下的构建和发布自动完成。

也要说代价

  • 没有现成的、好看的中文主题。这个站的样式是我自己写的,改起来自由,但一开始什么都没给。
  • 需要 Node 环境。虽然只在本地写作和构建时用到,但比 Hugo 的”下载一个二进制就能跑”确实多一层。
  • 生态比 Hugo 年轻。遇到特别偏的问题,搜到的答案可能不多。

如果你只是想安静地写 Markdown、不打算嵌任何东西,Hugo 会更省心。如果你跟我一样,文章里迟早要放点能跑的东西,那 Astro 值得多花那两天。