跳转到正文
Shane Blog
返回

自己动手搭博客:这次选型时我到底在纠结什么

自己动手搭博客:这次选型时我到底在纠结什么

这个博客现在用的是 Astro,配合一套叫 AstroPaper 的主题改出来的。写这篇之前想了想,其实没什么人真的关心一个人博客用什么框架,但既然是自己的地盘,随手记一下选型时的想法,也算是给以后的自己留个存档。

之前用过什么

最早折腾博客的时候,无非是几条常见路线:

第一种最省心,但基本没有自主权,样式、域名、甚至内容本身的去留都不完全由自己说了算。第二种功能是真的多,后台、评论、插件、主题商店一应俱全,但代价是维护成本——数据库、PHP 环境、安全更新,一旦有段时间没管,很容易出问题,而且对于一个更新频率不算高的个人博客来说,动态渲染每一个页面这件事本身也显得有点”杀鸡用牛刀”。

为什么最后选了静态站方向

想清楚自己真正需要的东西之后,其实答案没那么复杂:

这几条放在一起,静态站生成器几乎是唯一合理的答案:把内容写成 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,构建速度和页面加载速度都挺让人满意。如果之后需求变了——比如真的需要评论区、需要用户系统——再重新评估也不迟,反正内容都是纯文本,迁移成本本来就不高。


分类:
标签:
分享此文章:

上一篇
写了个小工具 shane-new-post,让新建博客文章这件事更省心
下一篇
HTTP 与 HTTPS 有什么区别?聊聊 TLS 握手那些事