从 WordPress 迁移到 Astro:零维护、最大控制权
From WordPress to Astro: Zero Maintenance, Maximum Control
一位博主在 WordPress 上运行 20 年后,将博客迁移到 Astro 框架并托管于 Cloudflare Pages,使用 AstroWind 模板。他用 Claude 生成的 Python 脚本把 61 篇文章转为 markdown,并通过按年份组织目录保留了原有 URL。迁移后站点为纯静态 HTML,由全球 CDN 分发,无需数据库和服务器维护。
如果你能看到这个,那就说明它成功了。

在 WordPress 上用了 20 年后,我把这个博客迁移到了 Astro,使用了 AstroWind 模板和 Cloudflare Pages。*
这个博客在变,技术栈也需要随之改变。虽然你不应该期待这里再出现技术文章,但分享一下我学到的东西还是值得的:
为什么要离开 WordPress?
随着时间的推移,我了解到 WordPress 对大多数项目来说都是一个臃肿的麻烦:
维护负担。 安全更新、插件冲突、数据库开销、垃圾评论管理、VPS 管理、处理 PHP,以及我永远用不到的功能。对于一个多年来都不是我优先事项的博客来说,WordPress 感觉就像一颗定时炸弹,随时等着被黑。
性能。 从全球 CDN 提供的静态 HTML 每次都胜过 PHP + MySQL。没有服务器端处理意味着毫秒级的加载时间。对于变化不大的内容,真的不需要整个数据库或其他臃肿的东西。
控制权。 我想要简单。我可以调整的 Markdown 文件、用 Git 进行版本控制,以及零数据库顾虑。不用再登录。不用再开“插件搞坏了什么东西”的故障排除会。不用再担心“PHP 过时了”。
WordPress 根本不再必要,尤其是有了 LLM 随时能炮制自定义代码的能力,我就是用这种方式搞定了 Astro。
为什么选 Astro?
一个词?速度。第二个词,简单。
静态优先理念。 Astro 在构建时生成纯 HTML,除非明确需要,我让它不含客户端 JavaScript。它默认就很快,没有框架臃肿。
Markdown + MDX。 在 Google Docs 中写作,导出为 markdown,需要时用组件增强。一旦 git 仓库更新,网站就会重新构建。对我来说干净又简单。
把 Astro 框架整合起来的人真的做得很好。
*注意:时间纯属巧合,但在这篇文章发布的前一天,Astro 宣布他们被 CloudFlare 收购了。
为什么选 AstroWind 模板?
在稍微玩了一下 Astro 之后,我意识到我想用它,但它没有可以套进去的“主题”系统。实际上,你最好从一个最接近你想要效果的模板开始,然后在此基础上修改。我看了几个,发现了 AstroWind。

这是一个预构建模板,集成了 Tailwind CSS、响应式布局、深色模式,以及所有博客必备功能:标签、分类和 RSS。
我从那里开始按自己的喜好修改。注意,这可能变成一个缺点,因为我现在的东西已经偏离得足够多,如果 AstroWind 有重大更新,把它补进来并不简单。但作为一个几乎没有安全顾虑的静态网站,我想我不在乎。
为什么选 Cloudflare Pages?
快速且免费:
零维护托管。 Git push → 自动部署。没有需要打补丁的 VPS。它就能正常工作,而且对我这样的小人物免费。
全球 CDN。 边缘缓存意味着各地加载时间都很快。内容从读者所在的地方提供,而不是从单一数据中心。
WordPress 迁移工作流程
所以流程是这样的:
内容提取:WordPress XML 导出 → Python 脚本(由 Claude 编写),将 61 篇文章转换为 markdown,并保留 frontmatter(标题、日期、分类、标签、摘要)。这里来回折腾了几次,事后还需要编写一些清理脚本。我在这里有点即兴发挥,可能一开始就应该更好地规划一下。
URL 保留:按年份将文章组织到子目录中(
src/data/post/2019/slug.md),这样 Astro 的路由会自动生成与 WordPress 完全一致的/2019/slugURL。没有失效链接,现有 URL 得以保留。评论归档:从 XML 中提取评论,转换为静态 HTML,附加到相关文章。对于新评论,我改用 Giscus,它由单独仓库中的 Github Discussions 提供支持。
图片处理:与我的博客文章 URL 不同,我的图片 URL 已经改变。我将 WordPress 的 caption 短代码改为
<figure>标签,并在base.css中设置对齐类样式。Astro 内置的图片处理会在构建时处理响应式图片。重定向迁移:导出 WordPress Redirection 插件的 JSON,在
public/_redirects中将规则转换为 Cloudflare 格式。
最后,我手动创建了 About Me 和 Services 页面,其模板借用了 AstroWind。
我如何使用 Claude 和 LLM
遗憾的是,我没有时间深入学习一个新系统,但幸运的是,如今我根本不需要这样做。这要归功于 LLM。

现在,技术爱好者们都在追捧 Claude Code,但我没有走这条路,因为我想稍微了解一下其中的原理。
所以,我创建了一个 Claude 项目,加载了文档,并询问 Claude Sonnet 如何在我的本地开发环境中进行更改和自定义。当事情变得棘手时,我会让它为 Claude Opus 生成一个大型提示。
将文档放入 LLM 项目
诀窍是让 LLM 项目获得它所需的一切知识,以便最好地回答我的问题,而无需不断搜索网络。Astro 和 Tailwinds 都有很棒的文档,但据我所知,没有办法将它们的文档获取为单个 MD 文件。所以我自己创建了一个。
我提示 Opus 创建一个脚本,从所有 Astro 和 Tailwinds 文档仓库中生成一个大型 MD 文件。你可以在这里查看、使用和修改这些脚本:
运行这些脚本会生成一个大型 MD 文件,然后你将其上传到 Claude 项目。它们刚好能舒适地容纳(目前使用了项目容量的 85%),现在我就有了一个能够回答我基本上任何需求的项目。我还将我的 GitHub 仓库链接到了该项目。
因此,每个 Claude 会话都有完整的上下文。不再有“让我搜索文档”的来回交流。不再有“这是文档链接”。Claude 了解整个框架,能够找到文件,但随后会告诉我该改什么……所以我至少得学一些。
我不知道其他人是怎么做这类事情的,也许这些是原始人的 AI 做法,但对我来说,这是“获得帮助”与“迫使我学习和动手”的完美结合。
最后一点:如果我需要第二意见,或者有一个我知道需要网络搜索的问题,我会用 Grok,它似乎有最好的网络搜索能力。
本地开发 → GitHub → 部署
当我对本地站点满意后,我部署到了 CloudFlare Pages(同样是在 Claude 的帮助下),并把 DNS 从我的旧 VPS 上切走。它立刻就生效了。
现在,Cloudflare Pages 监控 main 分支。一个 git push 会触发自动构建和部署。没有 FTP,没有 SSH,没有“wp-admin”。
结果
所以现在我们有了一个快速的静态 HTML 站点,没有数据库,没有 PHP,并且[希望]没有安全补丁或插件冲突。而且肯定更少垃圾信息。只有 markdown 文件、git 和一个全球 CDN。
那当我想写作时呢?打开 vim 或 Google Docs,生成 markdown,如果在意的话在本地测试,git push,然后看着它重新构建。挺酷的。
那为什么要经历这一切?
那么,为什么要为一个我几乎不更新的站点做这些?嗯,因为我即将开始更新它……大量更新。只不过不会是技术内容。
我需要一个更快、维护开销远更低的系统,而这个似乎就是那个。以至于我会把它用于我们新的 Bevlab 板块,更多内容即将公布。技术基本上是无形的,所以我可以专注于内容创作。
这大概是最后一篇网络技术文章
如果你是冲着 Web 开发、Astro 教程或技术栈讨论来的——感谢阅读!但别指望更多这类内容了,因为那不是我们在这里要做的事。
但如果你对维生素 A 中毒、铁过载、代谢健康实验、种植白胡萝卜,以及偶尔的文化吐槽感到好奇?那就留下来吧。因为那正是我要去的方向。
过去几年我逐渐认识到,我们对营养和代谢的认知,往好了说大多是不完整的,往坏了说是错误的。我一直在记录自己的健康实验,阅读没人谈论的研究,并连接那些在主流健康讨论中不会被连接起来的点。
这个站点将成为这项工作的家。
技术已经完成了它的使命:零维护、完全控制、随时可以发布。现在让我们用起来吧。
欢迎来到新篇章。
来源:Hacker News · mikeroberto.com