Technology

从 Jekyll 到 Astro:我的博客系统为什么要做架构分离

回看从 Jekyll、Hexo、Hugo、Next.js 到 Astro 的博客迁移,真正变化的不是框架偏好,而是写作源头、发布副本、构建系统和公开产物之间的边界。

从 Jekyll 到 Astro:我的博客系统为什么要做架构分离

我折腾博客很多年了。

一开始用 Jekyll,后来试过 Hexo,又换到 Hugo,再到 Next.js 博客,直到现在基于 Astro / AstroWind 重建。表面上看,这是一个不断换静态站点生成器和前端框架的过程;但回头看,真正变化的不是“哪个框架更好”,而是我对博客这件事的理解变了。

早期我关心的是:怎样最快拥有一个能访问、能写文章、能部署的个人站点。

现在我更关心的是:长期知识库里的材料,怎样经过筛选、改写、检查,再安全地变成公开博客文章。

这两个问题看起来都叫“搭博客”,但它们其实不是同一个问题。

第一阶段:博客仓库就是写作中心

Jekyll、Hexo、Hugo 这一类静态博客方案很适合早期个人博客。

那时的博客结构通常很直接:文章 Markdown 放在博客仓库里,主题、配置、静态资源和部署脚本也都在同一个仓库里。写完文章,提交代码,构建站点,发布上线。

这种方式的好处很明显:

  • 概念简单,文章在哪里,站点就从哪里构建。
  • 纯静态输出,部署成本低。
  • 框架和主题已经解决了大部分页面问题。
  • 对个人博客来说,维护成本可控。

Jekyll 胜在和 GitHub Pages 的天然关系,Hexo 对前端开发者更友好,Hugo 的构建速度和静态输出能力很强。每次迁移,都是在寻找更顺手的工具:更快的构建、更好改的主题、更熟悉的生态、更少的部署摩擦。

但这个阶段有一个默认前提:博客仓库就是写作中心。

文章的源文件、站点框架、主题配置和发布流程都放在一起。只要写作量不大、内容边界简单,这没有什么问题。

问题出现在后面:我的真正写作源头不再是博客仓库,而是私有知识库。

第二阶段:Next.js 解决的是站点能力

后来我转向 Next.js 博客,是因为想要一个更现代、更可定制的个人站点。

Next.js 的优势很清楚:React 生态成熟,组件化能力强,Vercel 部署路径短,SEO、路由、页面交互、图片优化、评论系统这些能力都能比较完整地拼起来。相比传统静态博客,它更像一个真正的 Web 应用。

这一步解决的是“站点能力”的问题。

我可以更自由地控制页面结构、交互细节、部署方式和周边功能。对于一个从无到有的现代博客来说,Next.js + Vercel 是很顺的一条路。

但它仍然没有真正解决后来的核心问题:我的写作材料越来越多地沉淀在 Obsidian 里,而不是沉淀在博客仓库里。

私有知识库和公开博客之间不是简单的复制关系。知识库里会有未完成想法、内部链接、项目上下文、私人判断和不适合公开的材料。如果博客系统直接把这些内容当作发布源,边界就会变得很脆弱。

所以 Next.js 阶段让我意识到一件事:博客系统不只是一个站点工程,它也是一个内容发布系统。

如果只关注框架和部署,就会把真正重要的问题藏起来:哪些内容可以公开,哪些必须留在私有知识库里,哪些需要改写成面向读者的文章。

第三阶段:Astro 更适合内容型站点

现在这套 Astro / AstroWind 方案,并不是因为 Astro 在所有意义上都“比 Next.js 更好”。

更准确地说,是它更适合我现在这个阶段的博客问题。

我的公开博客主要是内容型站点,不需要把每一页都做成复杂 Web 应用。Astro 的内容驱动模型、静态构建、Markdown / MDX 支持和 Island 架构,天然更贴近“文章站点”的需求。AstroWind 则提供了一套现成的博客结构,让我不用从零重新搭页面、SEO、列表、分类和基础样式。

但这次真正关键的变化,仍然不是从 Next.js 换到 Astro。

真正关键的是:我不再让博客框架直接成为写作源头。

现在的架构:把四件事分开

现在这套博客发布系统分成四层:

私有知识库
  -> 发布中间层
  -> Astro 博客构建仓库
  -> GitHub Pages 静态产物

每一层只做自己的事。

私有知识库负责沉淀原始材料。这里可以保留项目笔记、内部链接、未完成判断、私人上下文和长期知识结构。它首先服务于思考,不服务于博客框架。

发布中间层负责保存准备公开的文章副本。文章进入这里之前,需要经过筛选、脱敏、改写和 frontmatter 检查。这里的文章不是长期主版本,而是面向公开发布的副本。

Astro 博客仓库负责站点构建。它维护 AstroWind 框架、路由、样式、内容读取配置和构建流程,但不保存私有知识库的完整内容。

GitHub Pages 只负责托管最终静态产物。上线的是构建后的 HTML、CSS 和 JS,而不是我的原始 Markdown 知识库。

这套结构比“把文章直接放进博客仓库”多了一层,但这层正是现在最重要的部分。

为什么一定要有发布中间层

如果没有发布中间层,私有知识库和公开博客之间就只剩两种粗糙选择:

一种是把知识库直接接进博客构建流程。这样看起来自动化程度高,但风险也高:私有上下文、未公开判断、内部链接和不完整内容都可能被误带进发布链路。

另一种是在博客仓库里重新维护一份文章。这样边界清楚一些,但长期会变成两套源头:知识库一份,博客仓库一份。时间久了,文章来源、改写状态和发布状态都会变得难追踪。

发布中间层的价值,就是在二者之间放一个人工可检查的缓冲区。

一篇文章只有准备公开时,才进入发布副本目录。进入之后,它就按公开读者的标准来处理:标题是否清楚,摘要是否独立,内部链接是否清理,语境是否完整,是否还有不该公开的信息。

这样,私有知识库可以继续按照长期思考的方式组织,博客站点也不用反过来要求知识库迁就它的目录和字段。

框架迁移背后的真正变化

回看这条路线,Jekyll、Hexo、Hugo、Next.js、Astro 分别解决了不同阶段的问题。

Jekyll 让我拥有最早的静态博客入口。Hexo 和 Hugo 让我在静态博客生态里寻找更顺手的写作和构建体验。Next.js 让我把博客看成一个更完整的现代 Web 站点。Astro 则把问题重新拉回到内容本身:一个文章为主的站点,应该尽量轻、静态、可维护。

但最重要的变化不是工具表上的迁移,而是边界意识的成熟:

  • 写作源头不等于发布源头。
  • 私有知识不等于公开文章。
  • 博客框架不应该决定知识库结构。
  • 远端构建系统不应该直接接触未经筛选的私有材料。
  • 真正值得自动化的是清楚的发布流程,而不是把所有内容无差别推向公开。

这也是为什么我现在更愿意把博客系统理解成一个“带隔离层的静态发布系统”,而不是一个单纯的 Astro 站点。

小结

从 Jekyll 到 Astro,我一路换过很多方案。每一次迁移都解决了当时最痛的问题,但也暴露出下一层问题。

最早的问题是“我怎样拥有一个博客”。后来变成“我怎样拥有一个现代博客”。现在的问题则是“我怎样把长期知识库里的内容安全、清楚、可重复地发布出去”。

AstroWind 只是当前用来生成公开站点的框架。真正稳定下来的,是这套分层思路:私有知识库负责沉淀,发布中间层负责检查和改写,Astro 负责构建,GitHub Pages 负责托管结果。

博客最终呈现在读者面前的是一篇篇文章。但在文章背后,更重要的是边界:什么留给自己,什么可以公开,什么需要改写之后再公开。

Back to Blog

Related Posts

View All Posts »

VS Code 越用越慢?别忘了定期审计过时插件

项目打开缓慢不一定是文件太多或缓存膨胀,也可能是一个早已被内置能力替代的插件正在阻塞 Extension Host。记录一次插件性能排查,以及一套值得定期执行的审计方法。