博客

从 Next.js 到 Astro:一次以「内容优先」为原则的重构

#astro#nextjs#重构

这个站原本是一个 Next.js 15 的单页应用:Hero、技能、Live Demo、开源项目、 猫咪、页脚,全部硬编码在组件里。它没什么问题,但它只是一个门面

重构的动机不是「Astro 更潮」,而是三层解耦:

  1. 内容生产流:把跟 AI 的交互沉淀成可检索的知识,而不是聊完就忘。
  2. 内容组织层:Git 仓库即 CMS,所有内容是带 schema 的 Markdown, Obsidian 能直接打开编辑。
  3. 展示层:静态外壳 + 按需 island,阅读页 0 KB JS、秒开。

迁移其实很轻

审计之后发现,旧项目干净得出乎意料:没有任何 API routes、没有 SSR、 没有 getServerSideProps。真正需要客户端 JS 的只有主题切换一处,其余 八个组件都挂着 "use client" 却没有任何 hooks——纯粹是展示。

所以迁移的重点不是「翻译代码」,而是卸掉不必要的运行时

  • 展示组件 → .astro,删掉 "use client"
  • 主题切换 → 内联脚本,删掉 next-themes 和 React
  • next/image → 暂用原生 <img>,响应式留到相册阶段
  • 内容 → 从 config.ts 的硬编码抽离,交给 Content Collections

原则:先工作流,后门面

最大的风险是顺序倒置——先做炫酷的 Three.js 首页,结果知识库沦为摆设。 所以这次严格按阶段走:内容层和蒸馏流程跑通、沉淀出真实的笔记之后, 才轮到门面。

每次提交前问自己一句:这个改动,让「对话 → 知识 → 给人看的页面」这条链路 更顺了吗?如果只是更炫了,放到后面再说。