从 Next.js 到 Astro:一次以「内容优先」为原则的重构
#astro#nextjs#重构
这个站原本是一个 Next.js 15 的单页应用:Hero、技能、Live Demo、开源项目、 猫咪、页脚,全部硬编码在组件里。它没什么问题,但它只是一个门面。
重构的动机不是「Astro 更潮」,而是三层解耦:
- 内容生产流:把跟 AI 的交互沉淀成可检索的知识,而不是聊完就忘。
- 内容组织层:Git 仓库即 CMS,所有内容是带 schema 的 Markdown, Obsidian 能直接打开编辑。
- 展示层:静态外壳 + 按需 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 首页,结果知识库沦为摆设。 所以这次严格按阶段走:内容层和蒸馏流程跑通、沉淀出真实的笔记之后, 才轮到门面。
每次提交前问自己一句:这个改动,让「对话 → 知识 → 给人看的页面」这条链路 更顺了吗?如果只是更炫了,放到后面再说。