这两天把博客重构了一遍,从原来的 Shiro 迁移到了 Astro + Fuwari。
起因其实很简单。Shiro 已经很久没有维护了,而且它带着后端,实现上相对更重一些。偏偏这段时间我的后端服务器又迁移到了一个网络不太好的机房,性能问题一下就更明显了,打开慢、响应也不稳定。博客这种东西,我并不想长期盯着它的后端状态,所以最后还是决定改回纯前端、纯静态页面。
至于为什么选 Astro,一方面是因为它现在已经足够成熟,另一方面也是因为它相比 Hexo 这种更老一代的方案,确实更现代一些。内容组织、组件化能力、构建速度这些方面都更舒服,拿来做博客很合适。主题最后选的是 Fuwari,样式比较顺眼,结构也足够清晰,改起来不算费劲。
一开始我只是想把文章搬过来,结果真正开始迁移之后,才发现事情远不只是“复制粘贴”这么简单。
旧文章的 frontmatter 并不统一,图片来源也很杂:有本地图片,有外链,有图床,有些文章还是单文件,有些更适合整理成 index.md + 同目录图片 的结构。再往前翻,还能看到不少 Hexo 时代留下来的痕迹,比如摘要、标签、分类、链接结构都不太一致。
于是第一步就变成了整理内容本身。Shiro 那边的文章一篇篇迁过来,补发布时间、补简介、定分类、定标签,再把 URL slug 单独抽出来。带图片的文章尽量改成文章目录结构,外链图片能下载的就下到本地,避免以后图床失效。
这一步做完之后,文章本身就整齐了不少:
- frontmatter 统一了
- 带图片的文章尽量都变成了同目录资源
- 手记类内容统一归到
随笔 - 一些重复标签也顺手做了合并
内容整理完之后,下一步就是路由。
原来那套直接用中文标题做 slug 的方式虽然能用,但看上去总归不够利落。后来把文章 URL 改成了:
/posts/分类英文名/文章英文名
比如:
/posts/notes/first-time-keeping-a-car
为了避免每篇文章都维护两份分类字段,分类英文名没有写进 frontmatter,而是在代码里统一维护一张映射表;文章本身只保留 urlSlug。这样改完之后,文章页、归档页、分页、上一篇下一篇这些地方都要跟着一起调整,RSS 和 sitemap 也要一起检查,最后顺手把尾部的 / 也去掉了。
除了路由,我还顺便把主题上不少细节也一起改了。
比如:
- 修了 Markdown 代码块文字居中的问题
- 把 GitHub 仓库卡片从前端实时请求改成了构建时拉取缓存
- 增加了自定义 404 页面
- 给
/archive页补了一块摘要区域 - 加了友链模块
- 调整了全局字体和导航栏标题字体
banner 这一块改得尤其多。本来只是想调一下移动端位置,后来干脆扩成了多张 banner 随机显示。现在每一张图都可以单独配置:
srcpositionmobileHeightmobileOffsetcredit
右上角那块版权信息也顺手改了。现在桌面端默认显示作者,鼠标移上去后切换成图片描述和外链图标;移动端则改成第一次点击展开,第二次点击跳转。
这次还有个比较不一样的地方,就是整个过程里我一直在和 codex 一起做这件事。
它最适合干的其实不是“替我决定博客该做成什么样”,而是那些很碎、很多、但又必须处理干净的工作。比如批量迁移文章、补 frontmatter、整理标签、扫描旧链接、同步改多个相关文件、把外链图片下载到本地之类的事情,交给它去做,速度确实快很多。
当然也不是说一句话丢过去就可以完全不管了。像一些交互细节、文案、样式取舍,还是得自己盯着,很多地方也是来来回回改了好几轮才定下来。
最后这一轮改下来,博客的结构基本都重新梳理了一遍:文章迁移了,链接规则统一了,静态资源更完整了,原来依赖后端的部分也尽量去掉了。之后维护起来应该会轻松很多。
顺带一提,这篇文章也是Codex辅助我写的呢。
