Skip to main content

迁移到 Hugo

·133 words·1 min

经过五天的努力,我终于可以自豪地宣布:我的博客已成功迁移至 Hugo 引擎!

首先,为什么要迁移?主要是因为在过去三年的使用中,我对 Hexo 引擎已经积累了诸多不满;在这诸多不满中,首当其冲的就是对它的 Markdown parser 所积攒的一肚子怨气。Hexo 默认使用的 Markdown parser 是 Marked,而且默认启用 GFM 规范——这很好,但是 Hexo 在此基础上加入了一些自己的渲染逻辑(其中包含大量的正则表达式魔法)。一旦语法标记复杂起来,这些 Hexo 自定义的规则就开始作祟,带来各种匪夷所思的问题。后来,我为了使用 MathJax 渲染数学公式,将渲染引擎换成了 Pandoc;但 Hexo 的那些规则还在,所以问题依旧。

这个问题是在什么时候变得不得不解决了呢?是我的博客上线了 CO、OS 讨论区精华的时候:首先,这些讨论帖最初是发到讨论区的,而讨论区启用了许多 Markdown 语法扩展,你可以理解为讨论区支持的是 Markdown 的一种方言。其次,由于 Hexo 无法处理某些复杂的语法规则,所以用户必须刻意规避这些规则,你可以理解为 Hexo 只支持 Markdown 的另一种方言。问题在于,对于我自己写的文章,我可以通过避开某些语法来规避 Hexo 的各种缺陷;但对于其他同学写的文章,我却没有办法限制他们能用什么语法,不能用什么语法。最后的解决方案是,我写了一系列正则表达式来将他们写的源代码转换成 Hexo 能正确渲染的源代码,相当于是把 Markdown 的一种方言翻译成另一种方言。我真的是受够了

相比之下,Hugo 默认即支持 CommonMark。伟大,无需多言

除此之外,Hexo 还有一些琐碎的问题,但最重要的还是渲染问题。

唉!我知道 Hexo 最近几年一直很缺人手,但作为一名用户,我对此无能为力。一个 SSG 有这么多的 bug,连正常使用都有困难,大家哪里还有心情去贡献呢?没办法,我只好先润了。

那么,为什么我要等到现在才迁移呢?因为我一直都很忙,直到最近毕业才渐渐闲下来。说到这里,我想起这两天迁移文章时,才发现在三年半的时间里,我一共只写了 17 篇文章。可惜了,我应该多写一些的。希望未来能多写一些吧。

在 Hugo 众多的主题中,我选择了 Blowfish 主题。这主要是受到了 tsx8 的影响:你们可以去看看他的博客(很遗憾,最近一段时间下线了),简直美极了!另外,我在翻阅 Hugo 官网的主题列表的时候,就注意到 Blowfish 在主题列表中脱颖而出,我想这或许是 tsx8 选择它的一个原因吧。

将所有文章从 Hexo 迁移到 Hugo 大概经历了以下流程:首先,创建一个 Hugo 项目,安装 Blowfish 主题,并修改 hugo.toml 对站点进行基本配置。然后,将所有文章的 Markdown 源文件拷贝过来。接着,修复文章开头的 Front Matter,导入所有图片并修复图片链接。最后,考虑到所有文章的 URL 都发生了变化,而有些读者可能通过以前创建的链接访问本站的文章,我决定将所有文章在旧博客的 URL 重定向到新博客的 URL。

在配置重定向的过程中,我发现了两个奇怪的 bug,一个属于 Hexo 引擎,一个属于 NexT 主题:

  1. Hexo 文章的永久链接格式默认为 :year/:month/:day/:title/,其中的 :year:month:day 对应文章的创建日期。在本地环境下,永久链接中的日期与创建日期相同;但在部署环境下,永久链接中的日期永远比创建日期早一天。

    我不明白为什么会早一天,也不打算弄明白了。我打算采取简单粗暴的办法:把旧博客爬一遍,记录所有文章的 URL,然后逐个配置重定向。

  2. 为此,我用 wget 爬了一遍旧博客,并将输出格式设置为了 WARC。结果爬完以后回放的时候发现,所有页面打开都是一片白色。经过简单的 debug,我发现 NexT 主题会在页面加载时先让整个页面变白,再调用 Anime.js 让内容逐渐显现。其中 Anime.js 库是通过 Cloudflare CDN 加载的。由于我在爬网站时没有启用跨域,导致回放时 Cloudflare CDN 加载失败,整个页面停留在一片白色的状态,内容无法显现。

    这个错误低级到令人发指!NexT 主题的作者应该确保即使外部 JS 无法加载,页面仍然能够正常显示,而不是丢下一个空白页面让读者手足无措。

    最后的解决方法是启用跨域重爬一遍。

唉,不说这些了。最后分享一下我未来的计划:

  1. 配置一下评论区,要是能导入以前的评论就更好了(虽然一共也没几条)。
  2. 我曾将整理的 CO、OS 讨论区精华存放在旧博客上,但我并不打算将这些内容一并迁移至新博客,所以我需要为它们找个新家——开辟一个独立站点存放这些内容。在此之后,还需要在我的博客上建立重定向,将读者引导到独立站点。
  3. 新博客需要适度美化。目前只有黑白二色,比较单调。
  4. 当然,最重要的还是多写博客,内容才是博客的精髓。