自己动手搭博客:这次选型时我到底在纠结什么
这个博客现在用的是 Astro,配合一套叫 AstroPaper 的主题改出来的。写这篇之前想了想,其实没什么人真的关心一个人博客用什么框架,但既然是自己的地盘,随手记一下选型时的想法,也算是给以后的自己留个存档。
之前用过什么
最早折腾博客的时候,无非是几条常见路线:
- 直接用现成的博客平台,注册就能写,零成本起步
- 自己搭 WordPress,功能齐全,插件生态庞大
- 静态站生成器,写 Markdown,编译成纯静态文件
第一种最省心,但基本没有自主权,样式、域名、甚至内容本身的去留都不完全由自己说了算。第二种功能是真的多,后台、评论、插件、主题商店一应俱全,但代价是维护成本——数据库、PHP 环境、安全更新,一旦有段时间没管,很容易出问题,而且对于一个更新频率不算高的个人博客来说,动态渲染每一个页面这件事本身也显得有点”杀鸡用牛刀”。
为什么最后选了静态站方向
想清楚自己真正需要的东西之后,其实答案没那么复杂:
- 内容主要是文字加少量图片,没有复杂的动态交互需求
- 更新频率不算高,不需要评论区之类的实时功能(至少目前不需要)
- 更看重加载速度和长期可维护性,希望这套东西五年后还能正常跑起来
- 想把内容用纯文本 Markdown 管理,方便用 Git 做版本控制,也方便以后迁移
这几条放在一起,静态站生成器几乎是唯一合理的答案:把内容写成 Markdown,构建时编译成纯 HTML/CSS/JS,部署到任何一个静态托管平台上,没有数据库,没有后端运行时,攻击面也小得多。
很多人对”静态站”的印象还停留在”只能放几个 HTML 页面”,但现在的静态站生成器早就支持组件化开发、动态路由生成、图片优化、搜索、RSS 这些功能了,只是把”渲染”这个动作提前到了构建阶段,而不是每次访问都临时算一遍。
候选名单:Hugo、Hexo、Astro
真正开始选具体框架的时候,主要在这三个里面纠结:
Hugo 用 Go 写的,构建速度是出了名的快,生态成熟,主题也多。缺点是我对 Go 模板语法不算熟悉,深度定制起来学习成本偏高。
Hexo 长期是中文圈子里写博客的热门选择,插件生态和中文社区都很完善,上手也快。但整体架构偏旧,一些现代前端的能力(比如组件化、按需加载)用起来没那么顺手。
Astro 相对更年轻,但设计理念挺对我胃口:默认输出零 JS 的静态页面,只有真正需要交互的组件才会带上一点点 JavaScript(这个概念官方叫”Islands Architecture”,孤岛架构)。同时支持用 React/Vue 这类组件写法,也支持纯 Markdown/MDX 写内容,两边都不耽误。
最后选 Astro,一部分是因为这套理念确实解决了我的诉求——内容为主、交互为辅;另一部分纯粹是个人偏好,用下来写起组件和布局比较顺手。
主题选了 AstroPaper
框架定了之后,主题这块没有从零造轮子,直接用了社区里比较成熟的 AstroPaper 改造。这套主题本身就很轻量,暗色模式、归档、标签分类、RSS、搜索这些常见需求都自带了,剩下的工作主要是按自己的喜好调配色、改布局细节、接入自己的分类和标签体系。
文档站是另外单独搭的
这个博客之外,我还另外搭了一个 Starlight 文档站,专门放一些整理成体系的内容——比如安卓折腾类的教程、还有我自己写的两个命令行工具的完整用法文档。博客和文档分开的原因很简单:博客更适合放”这一篇讲一件事”的独立文章,按时间线往前滚;文档站更适合放”需要按目录结构组织、互相有依赖关系”的系统性内容,两者混在一起维护起来会很别扭。
Starlight 本身也是 Astro 生态下的一个官方文档站框架,所以两个站点在技术栈上是共通的,来回切换写作习惯的成本几乎为零。
跳转到我的文档站 →
顺手写了两个小工具
搭文档站和博客的过程中,发现一件挺烦的事:每次新建一篇文章或者一篇文档,都得手动敲一遍 frontmatter——日期、标题、分类、描述这些字段,格式还必须严格对齐 schema,手滑漏个字段就会导致构建报错。重复几次之后受不了了,干脆写了两个命令行小工具,一个叫 shane-new-post,专门给这类 AstroPaper 风格的博客用;一个叫 shane-new-doc,专门给 Starlight 文档站用。两个都发布到了 npm 上,后面几篇文章会分别单独展开讲讲这两个工具具体是怎么设计的。
小结
选型这件事本质上没有标准答案,更多是”当下的需求”和”框架的理念”能不能对上。静态站这条路走下来体验还算符合预期:写作的时候只需要专心码 Markdown,部署交给 CI,构建速度和页面加载速度都挺让人满意。如果之后需求变了——比如真的需要评论区、需要用户系统——再重新评估也不迟,反正内容都是纯文本,迁移成本本来就不高。