一. 为什么用hugo

2012年就建立了自己的博客,可是回望过去,并没有写过多少有用的东西。最近又想鼓捣一下树莓派和arduino,顺便写写学习的文章。可是一想到要用wordpress,就有点脑壳疼。wordpress虽然一直在更新,但是始终感觉用得不爽,不知道是因为vps在国外还是它本身运行就慢,点一个按钮就得反应半天。这种状态的话,完全不想拿它写东西。而且说实话,我只是需要有个地方写写文章,也不需要有什么炫酷的功能,所以用wordpress也算是有点杀鸡用牛刀。

我虽然自己写的文章少,但是看别人写的很多,我也发现越来越多的博客开始使用静态页面了。想想也是,博客本来就是很简单的东西,能显示文章,再有个评论系统和读者交流就够了,不需要什么花里胡哨的东西。静态页面,访问速度快,而且安全性还提高了,不用总担心wordpress又出什么漏洞还得升级。所以我就想借着这个机会,把博客也迁移到静态页面。

静态网站生成器这块主要流行的有Jekyll、hexo和hugo。其实很长一段时间之前就知道这些工具,但是一直懒得研究。这次迁移直接就选择了hugo,主要原因有三点:1. 生成速度(号称)最快; 2. 我对go语言感兴趣,有余力的话还可以看看人家代码怎么写的; 3. 我对ruby不感兴趣,对js的兴趣仅限于写页面。

二. 阅读hugo文档

决定了用hugo,第一步当然是把hugo的文档过一遍。这里不得不吐槽一下hugo的文档了。虽然有一个Get Started告诉你如果创建一个项目,但是创建好之前再往后该怎么做,就缺少循序渐进的引导了。有些地方写的比较模糊,看完不知道啥意思,还有一些概念性的东西解释得有点晦涩,比如page bundles那一篇就看得我云里雾里。

要是换了以前犯懒,到这里我可能就不继续了。但是这次下定了决心要把事情搞定,所以硬着头皮继续搞。好在文档只是写得不好,又不是不能用,基本的功能摸索一下还是能搞定的。

三. 导出wordpress文章到hugo

hugo简易的demo搞定,接下来就要想想怎么把wordpress的文章导入进来了,好在文档里写了从各个博客平台迁移的工具 https://gohugo.io/tools/migrations/ 。我用wordpress-to-hugo-exporter很快就把文章导出成了hugo的格式,我看了一下,大体上导出质量还是很好的。毕竟wordpress用的是html编辑器,完全转成markdown也不现实,所以还是有很多细节的地方需要手工修改一下,尤其是遇到图片和代码的地方。还好我之前的文章数量不多,就这我还弄了三四个小时才搞定。如果文章多一点,怕是又要打退堂鼓了。好在这次把文章都换成markdown格式的话,以后通用性会更强一点。

四. 编辑器选择

用markdown写文章,自然需要一款支持markdown的编辑器,没想到这个环节竟然让人有些脑壳疼。

之前付费购买的mweb倒是有目录管理的功能,但是只能打开markdown的文件,别的图片和配置文件还得用别的编辑器打开。太不方便。也可能是我用法不对吧。

又尝试用sublime text,它也支持目录管理,但是一来不能拖动文件位置,二来对markdown的支持也不能说太好。

最后,我竟然选择了平时写代码用的PHPStorm。既能管理目录,又有markdown预览功能,其他格式的文件也能打开,文件移动更是不在话下。

五. 如何组织目录

基本功能能用,内容也有了,接下来就得考虑一下怎么组织目录了。对于hugo来说,content目录下都是要输出的文章,但是我们自己管理内容,不能把所有的文章都写到一个目录下吧。所以我采用了按分类建文件夹的方式,按照原来文章的分类,把它们分别放在不同的目录下。但是这里要注意一点,除非在front matter里指定文章的url,不然放在不同目录是会影响到最终的url的,所以这一步还是得想清楚。毕竟谁都不希望别人收藏了你的文章,结果过一段时间打不开了。

我之前用wordpress的时候,文章都是指定url的,这也算是给自己挖了个坑。如果内容全是文字,倒也无所谓,导出工具把对应的url也导出来了。但是遇到有配图的文章的时候,就犯难了,图片应该放哪?

wordpress是有专门的图片管理功能的,而且图片的url是固定在上传文件里的,文章里直接引用就好。但是现在你面对只有文件夹,而且放在不同目录会影响到最终的url。我想到三种管理方式:

  1. 使用图床或cdn。这样可以直接引用图片,对于hugo来说,只是管理文字。但是有一个问题,把图片传到图床上难道本地就不留存了?如果要留存的话,那不还是要涉及到保存在哪的问题?放在hugo项目里有点尴尬,放到别的地方又会脱节。
  2. 使用static目录。本来hugo就准备了一个目录用来放图片之类的静态文件,当然可以把图片放到这个目录里。然而日积月累有了很多图片之后,你还能分清哪张图片是哪篇文章用的吗?我觉得我是不行。当然可以按文章建目录,但是图片和文章就不在一起存放,管理起来多少有些不方便。
  3. package bundle 这个之前让我有些迷惑的概念。其实说白了就是把文章要用的图片都放到一个目录里。之所以说文章指定url是个坑也是和这个功能有关系。如果文章url是指定的,那么bundle里的图片url就是相对于根目录的。这样一来,如果不同的文章里有同名的图片,编译之后就变成指向同一张图片了。为此,我把所有的文章都改成了指定slug的形式,这样图片url也变成相对文章slug的了,避免了同名问题。然而弊端是文章的url都变了,如果以前有人收藏过我的文章,现在就打不开了。不过我想想之前的文章都比较水,应该没有人收藏吧,哇哈哈。

六. 如何组织项目

前面的问题搞定后,下一个问题就是管理hugo项目本身了。作为程序员,第一个想到的就是用git了。这里有一个细节问题,是把hugo项目本身和编译出的静态文件放在一个git里还是分两个git。我选择的是分开存放。这样部署的时候只拉public目录的git即可,不用拉一堆没用的东西。

七. nginx部署

这块其实没啥可说的,把之前wordpress的配置里php相关的删掉即可。注意404的页面需要单独配一下,不然输入不存在的url直接亮出nginx的404也不太好

八. 评论系统和统计系统

我选择的主题自带了很多评论系统的支持,我之前用disqus,只需要配置一个参数就好了。至于以前的评论,数量不是很多,我也懒得迁移了。

同样的,之前用google analytics,主题支持,配置一个参数就好。