“莺迁乔木,燕入高楼”:我的博客搬家日记

| Views: | Total Words: 5.6k | Reading Time: 5 mins.

终于搬好了!之前说了一万年的搬博客计划,因为忙(其实我觉得是自己的拖延症)久久没有付诸实践。国庆放假回来之后,突然心血来潮想开工了。我知道自己是那种如果一旦没有兴趣,就绝对不会去干的人;因此好不容易有了兴致,得赶紧抓住机会了,不然怕是要拖到明年。

先放一下成品主页:


搬家计划

这次的搬家行动很清晰:就是把我在腾讯云 Lighthouse 上的 Wordpress 博客搬到 Github Pages 上,并采用 Hexo 作为框架。做出这个决定主要有以下几个原因:

  • 腾讯云的那个 Lighthouse 镜像我不太想继续续费了,所以上面的服务最好都逐渐移走。
  • Wordpress 在个人的使用体验上没有 Github Pages + Hexo 来的简单。
  • Markdown 语法对我来说比 Wordpress 那一堆插件来的友好。(虽然 WP 也有 Markdown 插件啦)

有了目标之后,执行就很清晰了。按理讲这应该是一个很快的事情,但是却足足花费了我将近一整天(一个下午+晚上,不过我是没有上午的,所以差不多就是一整天)。接下来让我来把这次的搬家之旅过一遍吧。


准备阶段

这次搬家除了更换技术栈以外,我还顺便”重构“了一下个人网页的布局。

首先,我想先给老博客换个名字。原先的名字叫”没有风经过的旅店“,现在听起来略显中二(也不知道当初我怎么起的这个名字)。想来想去,我选择了 ”度量空间(Metric Space)” 这个名字。这很大程度上源于我之前买了一个域名 me.tric.space。不过之前这个域名用来放我的学术主页,在下决心将它作为博客后,我忙活了一阵,把学术主页挪到了一个基于我真实姓名的域名下面(这样也更正式一些嘛),然后把这个域名腾出来给我的 “度量空间” 了。

这是我旧博客的页面,其实还是很好看的,只能说和这个博客是两种风格:

为此我特地还买了一个新域名,就是那个学术主页的域名。由于是 .com 结尾,价格还相对贵一些。不过作为一个 CS 系学生,感觉如果不能拥有一个 .com 域名还挺遗憾的,于是乎还是掏钱买了一下。

然后就开始配 Github Pages 和 Hexo 了。由于有经验,这个过程还是蛮顺利的。我用 WSL 上的 node 来跑 hexo 服务,用 Typora 来编辑 Markdown,整个体验可以说是非常棒。

下一步就是选一个 Hexo 主题。由于老博客的主题有点花哨(而且有点太二次元了),新博客我想采用简洁复古风的主题。选来选去,我挑中了 Cactus 这个主题,它的界面非常干净、直接。我进行了一定程度的魔改来让这个博客更符合我的品味一点,包括:

  • 把图标从仙人掌换成了更符合 “度量空间” 的正多面体
  • 在 Home Page 上加了两个元素:Pinned Posts 与 Categories,让原先相对单薄的主页更加丰富一些。
  • 给文章页面加上了字数统计和估计阅读时长。由于 Cactus 本身不支持这个,需要手动在源码里插入一些代码片。

这些改动都很简单,最多只需要修改一下主题的 JavaScript 源码即可达成效果。

在弄好主题后,下一步就是把原来的博客内容都搬过来。博客内容主要包含三部分:文章,评论和媒体(主要就是图片)。


搬运文章

Hexo 很良心地提供了原生的搬运支持,我照着 这篇教程 很轻松地就完成了前期搬运,具体操作就是在 Wordpress 那边导出一个 XML,然后用 Hexo 的 Migrator 导入就 OK。不过刚搬完问题自然是一堆:出现不存在的文章、格式混乱、日期对不上… 没办法,我只能硬着头皮一个个问题慢慢修。

日期问题比较好处理,只需要在一个 post 的 md 文件的头部进行修改就行。最致命的是数学公式问题。原先的 Wordpress 使用的 MathJax 插件的公式标示符是 \(\),而 Markdown 的则是 $。我原先写了一个 Python 脚本来自动化完成这个转换,但是仍然有很多情况没考虑到:比如很多地方在原来需要加 \ 转义,而现在不需要了,等等。

更烦人的是多行公式问题。Hexo 的 hexo-renderer-marked 插件会将 \\ 等符号视为特殊符号,产生的效果就是公式完全没有换行,都挤在一块。原先我尝试了两种解决办法:

  • 换成 Katex,但是 Cactus 主题没有原生支持 Katex,需要自己改代码;我改完之后,发现多行公式问题仍没有得到解决。
  • 在有特殊符号的公式上下,用 rawendraw 包起来(这里不能打全,不然会被 Hexo 吞掉)。这个方法是可行的,但是太麻烦了,而且这样魔改过后的 Markdown 文件在其他地方不通用。

后来我在 这个 Issue 里发现了可行的解决方案。点个赞!

在搬运的过程中,我同时也对以前的文章进行了一些小修改,如把原来分成(一)(二)(三)的博文合并成一篇等。


搬运图片

在 Hexo 里使用图片非常简单,只需要在 _posts 文件夹下创建和文章文件同名的文件夹,然后将图片文件放入其中,最后在 Markdown 文件里直接使用 ![](图片文件名) 的形式引用就行。

我原先还计划弄一个 CDN 服务来做图床,后来想想图片也没多大,就放在 posts 里一起传上去好了。之后如果有大的媒体需要放在文章里,可能会考虑别的解决方案。

还有一个想吐槽的点就是由于 Hexo 是基于 Markdown 的,因此无法做到像以前用 Wordpress 时那样的相框效果。不过倒也无伤大雅。


搬运评论

虽然我原来的博客没有多少评论(大多都是现实生活中的朋友来和我互动),但是为了保留回忆,还是想把它们搬过来。由于 Hexo 是静态博客,本身从原理上不可能实现评论功能,因此需要借助第三方的评论系统实现。现有的评论系统大概分为以下两种:

  • 使用 Github 的 Issue / Discussion 来实现评论,如 Gitment,Gitalk,Disqus 等。
  • 使用 LeanCloud 实现的无后端评论系统,如 Valine,Waline 等。

由于我需要把以前的评论搬过来,第一种方案自然被否了——除非我用我自己的 Github 账号把以前的评论都发一遍,那评论区看上去就是一片自言自语,也太怪了。所以我选择使用 Valine 作为评论系统。不过有一个坏消息:我使用的 Cactus 主题原生不支持 Valine,作者自己说他不想支持各种各样的评论系统,只选择了自己喜欢的两个进行支持,而这两个都是基于 Issue / Discussion 实现的。

好在开源的力量是无穷的。我在 Cactus 的 PR 列表里找到了热心网友实现的支持 Valine 的修改,并把它 merge 到了我的代码库里。修了几个小 bug 之后,完美运行!

接下来就是搬运评论本身了。具体的搬运方式很暴力——手动把之前的评论再发一遍,由于数据在之前的后台中都有保存,这个过程就完全是体力活儿了。有一个事情就是我需要把评论的时间也修改成和以前一致的样子,这个也比较容易实现——直接在 LeanCloud 后台改就是了。


转载知乎、豆瓣的文章

在搬完原先所有的博客内容之后,我还想做一件事:那就是把我最近一段时间在其它平台发的内容也搬过来。其实说是其它平台,适合做成博文的也就只有知乎(大多是阅读论文或者学习笔记之类的)、豆瓣(书评影评)了。我从这两处分别搬了一些文章,例如:

搬运过程中也遇到了很多小困难。其中最烦人的是知乎文章的格式和 Markdown 也不是很兼容。我找了很多 Zhihu 2 Markdown 的项目,用起来效果都不是太好,最后还是自己手动改了一下,主要修改的地方在于把知乎的公式变成 Markdown 的公式。


域名解析

前面说过,我把 me.tric.space 腾出来作为自己的博客域名了。那么有个问题,我怎么把这个域名映射到我的 Github Pages 上呢?想必有点网络知识的同学都懂,加一条 CNAME 解析就可以了。不过还有一个遗留问题,那就是我原先的博客地址 siriusneo.top 应该拿来干啥。我想来想去,决定先放着,然后顺便把 blog.siriusneo.top 指向了这个博客(这也是我的一点小强迫症,我觉得对应功能的网站就应该放在某个二级域名下,根域名应该作为某种 “基石” 网站存在)。这个指向我没有采用 DNS 解析,而是在我的服务器上的 Nginx redirect 301 来做。

通过整理后,现在我的几个域名终于算是比较清晰了:

  • me.tric.space :这个博客
  • siriusneo.top :待定,可能作为某个主站;现在暂时也指向主页
  • chaofanlin.com:个人主页

结语

好了,到这里我的博客搬家计划差不多就完工了,最后的效果我自己也是非常满意的,不过还有一些之后可以干的事情,比如说 RSS、加一些 Hexo 的小插件等。这次搬家花费了我大量的心力,大部分干的事情似乎看上去没什么意义(都是在给这些开源软件擦屁股),但其实我还是有不少收获的:首先当然是我获得了一个好看的并且方便部署的博客网站;然后我同时也熟悉了 Hexo 这个社区的生态以及大概的代码实现原理;还有就是重新复习一遍以前的博客。

今后,这个博客就不依赖于我的服务器了,它可以变得更加自由,我也会继续在上面更新博文(说是这么说,隔多久更新一次就不一定了…)。那么最后,恭贺本站乔迁新屋,好运常驻!