从 Hugo 到 Astro:一次由 AI 完成的博客迁移
几年前,我把博客从 Hexo 迁移到了 Hugo。当时我觉得 Hugo 很快,Go 也让我很熟悉。尤其是 Hugo Module,它可以把主题和内容分开,让博客只保留文章,主题只保留代码。那种内容和代码分离的感觉,在当时对我来说真的很优雅。
我到现在依然这么认为。Hugo 是一个非常优秀的静态站点生成器,Hugo Module 也是一个非常漂亮的设计。Congo 这个主题也陪我用了很长一段时间。它让我可以把精力放在写文章上,而不用总是折腾博客本身。
但是随着我越来越想控制自己的博客,我开始觉得 Hugo 有些地方并不适合我。
最主要的问题是 Go Template。我不喜欢这种写法。它夹在 HTML 里面的时候,看起来总有一种很奇怪的感觉。我讨厌写一大堆 HTML,再在里面插入模板逻辑。它不是我喜欢的表达方式。我更喜欢接近函数式组件的写法,逻辑、参数、组件结构都清楚地摆在那里。
另一个问题是自由度。Hugo 很强大,但当我想真正掌握页面的分布、路由的形状、语言之间的关系、RSS 的生成方式时,我总觉得自己不是在完全控制这个博客,而是在某个主题和框架已经给定的结构里做调整。这并不是错误,只是不适合现在的我。
所以这一次,我从 Hugo 迁移到了 Astro。
Astro 给我的感觉很直接。src/pages 就是路由,src/content 就是内容,组件就是组件。.astro 文件写起来更像是在写一个有输入、有输出的页面函数,而不是在 HTML 里艰难地塞模板语法。这个感觉对我来说非常重要。
我不想只是换一个主题。我想要的是一个真正属于我自己的博客结构。
这次迁移最特别的地方是,AI 直接参与了整个过程。不是那种帮我补几行代码的参与,而是我把需求一条一条说清楚,然后让 AI 把它们落成代码、内容结构和部署配置。
一开始,我只是想要一个接近 Bear Blog 的风格,不想再使用官方模板。后来需求慢慢变得清晰:我要完整的 /en/ 和 /zh/ 站点拆分,文章使用相同 slug,语言只体现在路径前缀里;每篇文章放在 src/content/posts/<slug>/en.md 和 zh.md 里;没有对应翻译时不显示语言切换;RSS 要分语言;首页要像 Profile;导航要简单;配置要拆成 TOML;Cloudflare Pages 要能直接部署。
这些需求如果我自己慢慢写,当然也能完成。但我很可能会在某个细节上停下来,比如 i18n 的 alternate、RSS、日期一致性校验,或者 Cloudflare 的构建设置。AI 的价值就在这里。它不是替我决定博客应该是什么样子,而是把我已经说清楚的想法快速变成一个可以运行的系统。
我负责判断方向,它负责把结构搭出来。我负责取舍,它负责执行细节。我负责验收,它负责修正问题。
这是一种很新的写代码体验。
现在这个博客有完整的双语路由。英文是 /en/,中文是 /zh/。文章列表、文章详情、About、RSS 都按语言拆开。首页保留了 Profile 风格,文章摘要也会接近两行,而不是短得让页面显得空。语言切换只是一个简单的下拉框,不多解释,不占地方。Cloudflare Pages 也已经迁移到了 v3,构建命令就是 pnpm build,输出目录就是 dist。
这些东西看起来只是配置和页面,但它们组合起来以后,我终于觉得这个博客又回到了我的手里。
以前我会觉得主题是一个很重要的东西。一个好主题可以让博客很快变得漂亮,也可以让我不用关心很多细节。但现在我更想要的是可塑性。我想要随时改首页,随时改语言逻辑,随时调整文章列表,随时把某个想法落到页面上。
Astro 让我有这种掌控感。AI 则让我可以更快地把这种掌控感变成现实。
这并不代表 Hugo 不好了。Hugo 依然很好,它快、稳定、优雅。如果我只是想写文章,不想碰页面结构,它依然是一个很好的选择。但现在我想要的不只是一个博客主题,而是一个可以被我不断塑形的个人工具。
这一次迁移让我重新掌握了自己的博客。
我不只是换了一个框架,而是重新拿回了博客的形状。