1552 字
8 分钟
页面浏览--访问次数--
博客搬家记:从 Hexo 到 Astro

这个博客换了个新家,写一篇记录一下。 这张图就是老站最后的样子 —— 「KLucenの启示录」,2025 年 12 月 14 日发出第一篇文章,框架是 Hexo 7.3.0 + Butterfly 5.5.2。到我动手搬的那天,它首页上还写着:文章 10 篇、标签 16 个、分类 3 个、总字数 4.5 万字。

新家长什么样#

老站现在这里
框架Hexo 7.3.0Astro 7.3.2 + Svelte 5
样式Butterfly 5.5.2Shirone(来自b站大佬Shirone-谷歌M3E规范设计的全新开源博客主题_哔哩哔哩_bilibili)
无刷新跳转PJAXSwup
搜索Butterfly 本地搜索Pagefind
评论Waline(自建服务)Giscus(评论就是 GitHub Discussions)
部署Vercel + GitHub Pages 双线Vercel,内容仓一 push 就自动构建

老站的东西都搬去哪了#

  • 文章:老站 10 篇里有 8 篇原样搬了过来,剩下两篇是当初的测试文章(Hello World 和《第一篇文章》),留在老站当化石。
  • 链接一个字没改:当初的 abbrlink 是 crc32 算出来写进 frontmatter 的,搬家时把这些值一起抄了过来,所以 /posts/c84b68c2.html 这样的老地址现在照样能打开。
abbrlink: 'c84b68c2'
permalink: 'posts/c84b68c2.html'
  • 说说 → 动态页,照片 → 相册,追番 → 番剧页,内容还是原来那些。
  • 友链、关于都还在,只是换了位置。
  • 看板娘 koharu 也跟着搬过来了,还站在屏幕角上。

新框架有什么优点#

搬过来用了一段时间,最直接的感受是这几条:

  • 页面是「拼」出来的,不是改模板改出来的。 各个页面由组件拼装,页面上的卡片来自 data/ 下的数据文件 —— 技能、项目、游戏、时间线、设备、友链、站点罗盘各一份,想多一张卡片就多加一个对象,不用去动模板。
  • 默认不发光 JavaScript。 整站输出的是静态 HTML,只有真正需要交互的区块(数据驱动的那些)才在滚进视口时加载组件;老站是整站注入主题脚本再配 PJAX,首屏要重一些。
  • frontmatter 有 schema 把关。 文章属于内容集合,字段类型、必填项都由 schema 约束,写错在构建时就报错,不会像以前那样「页面看着正常,只是少了点什么」。
  • 搜索、评论、跳转都不用自己养服务。 Pagefind 在构建时就把索引做好,查询时按需取分片;评论直接落在公开仓库的 GitHub Discussions 里,零后端、零数据库;站内跳转交给 Swup,它有完整的生命周期钩子,播放器、看板娘这些常驻元素都不会被刷新打断。
  • 能写的东西变多了。 代码块支持行高亮、标题、折叠、差异对比,正文里还能用提示框、卡片、步骤、标签页、脚注、数学公式,站上那个「写作语法演示」系列就是把它们逐条演示了一遍。
  • 配置只需要写想改的键。 主题默认值和我的个人设置分开存放,配置文件里出现的就是我动过的那几行,主题升级后新的默认值会自动生效,也不会把我的设置盖掉。

搬的过程里真正花时间的三件事#

一、把内容从代码里拆出来#

老站是文章和主题挤在同一个仓库里,改个样式顺手就可能带上文章。新站拆成了两个:

  • shirone-blog(公开):主题源码和构建配置;
  • shirone-content(私有):文章、页面数据、配置覆盖、图片。

写文章只需要动内容仓,pnpm content:sync 会把内容物化到代码仓的标准路径,之后构建链完全不变。

Terminal window
pnpm content:sync # 内容仓 → src/content、src/data、public
pnpm dev # 本地预览

二、顺手写了个管理端#

搬完之后写文章得手写 frontmatter、手动挑图、手动排序,太原始了,于是做了个本地管理端 ShironeAdmin:左边选页面,右边直接改字段,图片能预览,图标能直接看效果。

两个细节是自己特意加的:

  • 写回只改必要的行:不会把整个数据文件重新格式化,diff 干净,出错了一眼能看出来;
  • 每个文件都有「撤销」:改坏了不用去翻 git。

三、评论换成 Giscus#

评论使用了Shirone主题支持的 Giscus:评论直接落在公开仓库 KLucen/ShironeComment 的 Discussions 里,零后端、零数据库,数据还是自己的。

这里遇到一个坑:新站同一篇文章有两个都能打开的地址(/posts/<abbrlink>.html/ 和 /posts/<分类>/<abbrlink>/),Giscus 默认按 pathname 映射,会把同一篇的评论劈成两条讨论。改成按 og:title 映射、并开启严格匹配之后,两个地址终于共用同一条讨论了。

踩过的坑#

  • 重复的数据会让整块页面变空白。 数据里出现两条一模一样的内容时,Svelte 的 {#each ... (key)} 会直接抛 each_key_duplicate,那一块就整块不渲染 —— 页面看着像「少了点什么」,只有控制台里写着原因。
  • 大图得先压。 动态里几张图原来是好几 MB 的截图,压成 webp 之后只剩几十 KB。
  • 列表里的摘要只显示两行,所以摘要写得越短越好。
  • 转载要写清出处。 站上有一部分文章是整理 Shirone 官方文档的语法演示,开头统一加了版权与转载声明,标清作者和许可协议。

现在#

老站还留着,klucen.github.io 现在也还能打开,就当是纪念。新站在建设好后,为了填上系列页没有的空白,搬运了作者在网页Markdown渲染上做的适配内容的写作语法,以及一册怎么学好Python的0-100天教程,因此在写这篇文章的时候这边已经有了四十多篇文章,此外比老站多了系列、技能、项目、游戏、时间线、站点罗盘这些页面 —— 页面上的内容全都写在内容仓里,想改直接改文件,不用再跟模板较劲。

虽然站点的框架变了,但内容都在,链接也没断,我觉得这就够了。

博客搬家记:从 Hexo 到 Astro
https://www.klucen.cn/posts/生活内容/88260717/
作者
KLucen
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

评论

正在加载评论...