终于决定把博客从Hexo迁移到Hugo了
用了很多年 Hexo。最初它简单、够用,主题也很好改。但这些年为了贴合自己的习惯,我不断加功能、改样式、补插件和脚本,魔改了太多东西。
回头看,网站能正常运行,却越来越危险,上次升级6.3版本我就因为魔改搞了好久。这次迁移的原因并不是 Hexo 不好,而是我改得太多,继续维护这些定制的成本开始超过它们带来的方便。
为什么决定迁移
需要维护的已经不只是文章页面。中、英、日三个站点各有配置,发布时要依次生成和部署;首页、随笔年份归档、小说分类、标签、语言切换、字数统计和关于页面,也都有各自的主题逻辑。每次想改一个小地方,都要先弄清它会不会影响另外两个语言站或其他页面。
部署流程也累积了不少历史包袱。原来的 GitHub Actions 需要为三个站点分别准备密钥、运行 Hexo,再通过脚本切换配置和生成结果。它一直能工作,但依赖版本、Node.js 运行环境和自定义脚本都需要继续照看。博客本来应该让我专心写东西,而不是每次更新都担心构建和发布流程。
最近年纪大了,有时候写东西本身就已经提不起兴趣,还要担心比如半年没写了,各种配置参数是不是还正常,我也担心什么时候提交之后还要跑到github上查报错,然后再调整。
所以我想把内容和展示逻辑重新理一遍,尽量回到 Hugo 已经提供的内容管理、Markdown 解析和代码高亮能力,把必须保留的个人设计放在少量的模板里。
迁移是怎么做的
之所以敢做迁移,还是要感谢chatGPT,有了大模型我才敢尝试迁移。为了不影响正在运行的 Hexo 站,我先让codex把 Hugo 项目放在独立目录中迁移和验证,没有直接覆盖 Hexo 项目的文件。先检查旧站的配置、主题修改、插件、文章 front matter 和 GitHub 部署流程,再以旧站生成结果作为链接和页面结构的对照基准。
文章按中文、英文、日文分别放进 Hugo 的内容目录,并尽可能保留原有标题、分类、标签、日期和文章 URL。迁移时也重新整理了内容结构:首页只列经验文章,随笔按年份归档,小说按分类归档。这些全是我当年的定制,现在就是留下的大坑。
像字数、阅读时间这样的文章数据由 Hugo 根据内容生成,界面和 Markdown 也逐项核对。多语言切换、目录、上一页和下一页等功能迁入 Hugo 模板,代码围栏交给 Hugo 自带的 Goldmark 和 Chroma 处理。
Hugo生成的sitemap无法解析
我把迁移前后的三份 sitemap 做了对照:中文条目数是 243 对 243,英文是 90 对 92,日文是 217 对 219。按 URL 解码和 Unicode 规范化后,已有文章地址都能找到对应项:中文 176 篇、英文 42 篇、日文 162 篇;日文 sitemap 还多列出了一篇旧站 sitemap 中没有的文章。少数地址的百分号编码等字符串表现不同,但规范化后的路径一致。
迁移后还发现,中文站的 sitemap 虽然能打开,但 Google Search Console 无法解析。原因是三个语言站原先由一次多语言构建共同生成:Hugo 输出的是 sitemap 索引及语言子目录 sitemap,而部署目标实际是三套彼此独立的网站。中文 sitemap 因此落在 /cn/sitemap.xml,但其中列出的页面使用中文站根路径,位置和部署结构不匹配。浏览器里看到内容连在一起也容易让人误以为文件不是 XML;关键问题在于 sitemap 的生成和部署路径。
**处理方式是让中文、英文、日文分别使用各自的 Hugo 配置独立构建。每个构建只启用一种语言,直接在该站点发布目录根部生成标准的 sitemap.xml,不再输出多语言 sitemap 索引。**三个站点仍各自使用原来的域名路径和部署仓库,彼此不需要通过 sitemap 建立语言关联。调整后,网页打开 sitemap 已能按 XML 格式显示, Search Console 中重新提交各站点根目录的 sitemap,也能正常抓取了。
依然保持用GitHub Actions 发布
切换到Hugo之后,我依然保持用 GitHub Actions进行部署。还是之前的deploy 工作流会在 hugo-migration 分支收到推送后运行:分别使用中文、英文和日文的配置独立构建,再把三个站点部署到原来的目标仓库。每个发布站点的根目录都会带有自己的 sitemap.xml,例如主站 /sitemap.xml、英文站 /en/sitemap.xml、日文站 /jp/sitemap.xml。
部署仍使用博客仓库中已有的三个 Actions secrets。这样以后写完文章,正常提交并推送 Hugo 分支,就会触发同一条工作流,不必手动生成三个版本,一切都是老样子,同样的仓库、同样的密码,这样所有的问题都不会变,只是以前是打开hexo项目进行提交,现在是打开hugo项目进行提交。
迁移之后
想说这在之前,如果想做这样的操作,可能需要一天甚至更久的时间。现在用codex,只用了半天时间,其中要解决代码块格式和sitemap浪费了两个小时,所以如果没有这个可能两个小时就能全部搞定了。
hugo的速度确实比hexo快,但是这并不是最重要的,主要是我实在懒得、也记不住自己魔改的东西了,我担心未来某次更新就直接完蛋了,哈哈哈哈。
