缘起
从2016年4月24号开始,我的博客从WordPress迁移至Hexo。当时Hexo算是当红炸子鸡,原生支持Markdown语法,支持静态部署,支持各种插件,还支持各种换主题,让人感觉非常极客。当时我用了Hexo的一个插件,从WordPress一键迁移到Hexo,虽然数据都迁移过去了,但实际上中间很多格式已经丢失。
当时我的整个博客部署流程是这样的,首先是从本地push数据到github,通过github触发webhook,回调至我的服务器。然后在我的服务器上调用hexo g
生成静态页面。之后再由nginx提供http服务对外透出。
之所以使用我的服务器,而不用github托管的原因是:百度搜索引擎被github屏蔽,在github托管的静态页面基本上都不会被索引。
hexo什么都好,就是运行时太占用CPU,不能手动限制速度。在2018年左右,服务器提供商开始限制短时间内占用CPU行为,我的node运行1分钟后,就会被自动kill掉。那时还不懂是怎么回事,还发了工单,最后得到的答复就是不能这么占用。再之后,我便接触学习了travis-ci,当时用的还是travis-ci.org。在travis-ci上执行hexo g
命令,将生成好的静态页面push到github。在github上触发回调,由我的服务器拉取最新静态页面。
上边这个流程虽然运行慢了一点,但总归还是能用的。但从19年开始,我的服务器连接github的速度越来越差,基本上只有几十KB/s。有一次,有很急的发布,github上有最新的静态页面了,但我等了半天,我的服务器还没有拉取到最新的静态页面。你说气不气人?
前几个礼拜,我又想到了一个方法,在travis-ci上直接push静态页面到gitee上,服务器拉取gitee代码还是很快的。由于业余时间不多,经过这些次折腾,我逐渐感觉到使用hexo对我来说是一种负担。每次写文章都要先把本地服务打开,写完调试好后,还得push到github,push完不说,还得检查服务器有没有把数据同步过来。
选择
很早之前和阮一峰有过邮件交流,当时向他咨询用哪个博客程序好,他说虽然他用的是Movable Type
(基于Perl语言的博客程序),但还是建议我用Wordpress。自从我用上Wordpress,我对它的感觉一直都是臃肿。原因是他的代码框架厚重,扩展点多,让人摸不着边际。这虽然能让他变得足够通用,可以做商城、视频站、小说站等等,但仅仅是作为博客而言,的确是不合适。
最早在学校的时候,我最先接触到的博客程序是emlog,对emlog也没留下特别的印象。之后,我也接触过Typecho,那时候Typecho的界面已经足够简洁大方了,但在那时,它还不是特别稳定,而且功能也比较少。
经过这些年的折腾,我越来越感觉到,我想要的是一款专门用于博客的程序,不要有太多花里胡哨的花样,也不要经常更新。这样,就能迫使我把精力投入在写文章上,不再关注别的事情。
最后,我的选择是Typecho
。
迁移
准备迁移前,我的文章已经有一百多篇了,迁移最好还是能保证自动化,不需要我一篇一篇复制粘贴。下面几项是我比较看重的迁移注意事项:
- 数学公式渲染
- plantuml支持
- 本地图片自动迁移
- URL链接保持不动
根据之前调研到的情况,typecho本身不支持数学公式渲染、plantuml也是无从谈起、图片信息保存在数据库中、URL链接部分可以定义。
所以针对迁移遇到的问题,我分别学习了Hexo和Typecho的API插件机制。基本上解决了上面的问题。
文章、分类、标签迁移
这三个迁移起来还是比较顺利的,我采用的方案是:注册一个Hexo插件,在generate行为上做扩展。在generate时,我会拿到所有文章、分类、和标签信息,之后将这些信息封装成Typecho数据表中需要的格式。
再然后以json的格式写入本地文件,再由数据库工具,将json格式的数据转成insert语句,写入数据库。
数学公式渲染
数学公式渲染,我采用的是MathJax库来支持,原因是Hexo中也是采用MathJax实现的数学公式渲染。在Typecho中的实现方式是增加一个插件,在插件中注册对Html页面head的扩展,在扩展中提供MathJax注入。
plantuml支持
plantuml是一种通过文字来描述图的规范,在Hexo上的实现是:找到由<img src="http://www.plantuml.com/plantuml/svg/ItWwgIS10000"/>
包裹的代码,将其压缩并经过base64编码,生成一个img元素,url指向plantuml的服务器,参数就是经过base64编码的字符串。
我在Typecho中使用插件,通过注册对markdown调用的扩展,也实现了上述逻辑,解决了这个问题。
本地图片迁移
我在Hexo中通过Hexo Admin来写文章,这个插件默认会把图片保存在source/images/
目录下。而Typecho却把图片放在/usr/uploads/
下,然后在数据库中也注册了图片信息,并且还关联到了文章。
所以我需要做两件事,第一件事:获取文章中用到的本地图片,然后将source/images/
目录下的本地图片移动到合适的目标文件夹下。第二件事:关联上文章id,生成Typecho数据表需要的格式,以json格式写入的到本地文件。最后再通过数据库工具转换格式写入到数据库中。
URL链接
Typecho支持对文章固定链接的修改,只需要修改成之前Hexo中用到的格式即可。但有一些页面像/tags/
、/categories/
等等,Typecho都没有对象的页面,由于也不是重点页面,目前也不考虑增加此类页面。
但如果有需要转义的页面,可以通过注册插件的方式,在路由上扩展。如果要增加缺失页面,估计可以通过改写主题的方式来实现。
小结
迁移过程还是比较艰辛的,因为也没有现成的插件帮我做这些事,其次,如果有插件,估计学习成本也不低。
以后可能就会安安心心用Typecho了,懒得再折腾了。
有关Hexo迁移至Typecho的插件,还有在Typecho上支持MathJax、plantmul的插件。我会再完善完善,到时候开源出来,帮助有需要迁移博客程序的朋友。
如果有朋友在迁移过程中遇到问题,可以通过留言板或邮件咨询我。我很乐意分享我的知识。
2020-04-19补充
- hexo-2-typecho迁移插件,用在hexo中。