先辈们说:Don’t Reinvent The Wheel, Unless You Plan on Learning More About Wheels,反正就是不要重复造轮子,因为这本身是一件浪费时间的事情。

最早的时候我是使用Wordpress的,那个时候是还是LAMP、LNMP满天飞的时代,各种一键脚本层出不穷,虽然我不一定会用,但是事实证明我总是重复地去配置,也没有整理成自动化的脚本最后对于我掌握这门技巧还是没有任何实质性的帮助。就这样用了很久很久,博客也得到了比较好的发展也有不少的访问量了,突然发现了Github Pages,而且借助Cloudflare也可以实现半程的HTTPS访问,具体怎么做可以自行Google,这边不作赘述。然后折腾了一段时间之后得到了最优解(也使用过Pelican Static Site Generator):Hexo+NexT。当然,维护了一段时间之后发现场上除了经久不衰的Wordpress之外还出现了GravGhostTypecho等优秀的CMS搅局者,但是这些都没有吸引住我的目光,直到GoHugo

Gohugo是个非常高效的静态博客生成器,而且是用我当时最痴迷的Golang编写的,切举例子说当博客数量在100+篇时Hexo的生成速度非常的缓慢,但是Hugo几秒钟就生成好了(当然随着版本的迭代我相信Hexo已经解决了这个问题)。所以当时二话不说直接再次抛弃之前的博客(尽管配置好了很多东西),采用了Hugo+cocoa-eh-hugo-theme来生成我的个人博客,然后托管在VPS上。而为了实现真·HTTPS,我自己购买了SSL证书配置了Nginx+HSTS,每次写完博客之后通过Rsync增量同步到VPS的nginx目录上面去,同时为了实现清真的部署方式我的Nginx是容器部署的。具体怎么做的如果有人感兴趣可以留言让我介绍一下,有这个需求的话我可以再写一篇唠唠嗑介绍一下,这边略过。

直到最近我了解到了现在大家偏向于把自己的博客部署在Netlify或是Zeit上,当然还有持续的生命力的Github Pages,我猜测可能是前面两种支持无痛的CI吧(当然之前也有人会使用Travis CI自动生成静态网页然后部署在Github Pages上,因为我本来就不会选择部署在Github Pages上所以就直接忽略了)。虽然现在Github已经开放了GitHub Actions,可能更加方便CI了吧,但是我还没好好了解过所以就先不谈了。另外Netlify和Zeit都支持自动申请和续期Let’s Encrypt 的免费HTTPS证书,甚至自己也不用使用Acme.sh去申请和管理自己的证书,非常方便,所以我决定尝试一下(而且可以每个月省一笔VPS的开销,何乐而不为?虽然早晚会被割韭菜的,但是到时候再说吧)。

因为之前的主题实在是不够美观(虽然真的非常简洁),所以我选择更换主题为Even,但是碰到了个很大的问题是这个主题是从Hexo移植的,最后一次更新还是在2018年,算是很久没更新了。另外就是如果打开了TOC会导致浏览器的滚动条无限滚动,我还提了个issue。所以我就很没骨气地准备迁移回Hexo,就为了用这个我比较喜欢地主题。嗯,我真是个渣男+外貌协会。

所以这次结论就很明确了,使用Hexo+Netlify+Even来部署我的个人博客,接下来简单介绍一下步骤。

  1. 创建一个repo,名字无所谓,提交到Github上。
  2. 本地初始化hexo:hexo init blog
  3. fork一个主题的分支(因为我们需要自己对主题做一些更改而且又希望能够拉取到上游的更新,这意味着我们需要维持repo的git目录且需要有自己的主题仓库。),比如我就fork了even
  4. 进入目录blog之后clone主题,比如:git clone https://github.com/D0zingcat/hexo-theme-even themes/even, 如果是even的话还需要安装一个依赖 npm install hexo-renderer-scss --save,同时复制一份主题的配置文件出来到一个全新的配置文件 cp themes/even/_config.yml.example themes/even/_config.yml
  5. 使用Github授权登陆Netlify,并且授权blog那个repo的访问权限,设置好部署命令 hexo generate 设置好域名(CNAME指向这个netlify的域名),其他的默认就会启用这个生成的功能,只要那个repo有提交就会自动启动拉取数据并部署。
  6. 设置Rss。hexo默认是不启用rss的,需要启用的话需要自己安装一个插件 npm install hexo-generator-feed --save ,当然配置文件可以参考我的repo,也可以看even官方的wiki,写的已经很详细了。另外我发现主题中feed是default的时候会报错Hexo Unhandled rejection TypeError: path.startsWith is not a function ,没有细究(因为不懂js),查到说把rss关了就好了,尝试了一下果然是可以的。但是这个方式不够清真,因为万一自己的读者喜欢用rss呢,所以我捣鼓了一下发现把主题的_config.yml中的feed从default改成’atom.xml’就可以解决这个问题,神奇,我也不知道为什么。
  7. 发现Disqus现在也进入了收割期,开始投放广告和推出来Plus版本的套餐,嗯, 好像没那么清真了。同时我因为准备把自己的博客更名(包括访问地址)的缘故(blog.d0zingcat.xyz->infloop.life)意味生活就是一个无限循环,所以当我试着用这个shortname去注册disqus的时候我发现被人注册了,所以我就不开心了,果断放弃之,毕竟主题还支持其他的评论插件。本来准备使用来必力,上官网看了一眼发现不是我想要的,所以就选择了gittalk。gittalk配置需要几个步骤:申请Github Application,记录下client id和client secret,authoriaztion callbackurl填博客主页地址就好。even的_config.yml中的参数对应改一下就好。需要注意的是repo填repo的名称(比如我的就是infloop.life),github id填你的用户名(不是邮箱,比如我的是d0zingcat),还有 enable 别忘了改成 true(默认是false)。另外就是如果提示“#未找到相关的issue评论,请联系xxx初始化创建”,意味着你需要使用登陆该repo的所有人的Github账号并且随便点开一篇文章之后点一下Gitalk的登陆按钮,之后你进入的文章就会自动开启gitalk评论框了。
  8. 发现Gitalk有个致命的缺陷,那就是每个文章会创建一个issue(我感觉这个东西还是比较适合某个开源项目的主页),所以可以看到github的activities全是issue,而且我也不能保证我的读者全部都是程序员,而Gitalk需要登陆Github才能评论。这个感觉不够清真,所以就又换回了Disqus。
  9. 因为每次提交修改都需要三连:add、commit、push比较麻烦,作为程序员还是无法接受,于是写个Makefile(需要提前安装好GnuMake,可以通过brew install make来安装),可以参考附录。然后之后每次提交只需要make m="commit msg"进行提交啦。

值得注意的是每次对主题进行修改之后需要在主题repo内部进行一次提交,然后到外部仓库再做一次提交(不论你对主题仓库做多少次提交对于外部仓库而言都是几成一次特殊的文件提交)。比较坑的是Netlify在拉取信息的时候,如果主Repo中有repo的嵌套,必须添加submodule,但是submodule中不一定会追踪文件的更改。可以使用命令 git submodule add -b master https://github.com/D0zingcat/hexo-theme-even themes/even 进行添加子模块,然后重新提交一下整个项目文件即可。submodule不会追踪子模块的更改,换言之如果要对子模块进行更改,那么需要进入到子模块提交文件修改之后再在主目录下进行提交,这时子模块是作为一个特殊的文件引用(160000 mode)提交的。如果子模块添加错了可以参考这个。但是有个比较坑的地方是even这个主题里面的.gitignore中有_config.yml,所以自己自定义的配置文件更改都默认被忽略掉了(我找了半天的问题就是不明白为什么submodule会没法追踪文件的修改),记得从中删除之后重新提交配置文件,不然Netlify也没法拿到正确的配置。同时Even因为有gh-pages的分支,Netlify会自动拉取这个分支然后就报错了,具体原因未知,也懒得追溯。手动删除master之外的分支之后重新deploy得到解决。

Refer

Hexo Next主题集成Gittalk

Gitalk

GitTalk评论配置

使用gittalk实现hexo博客评论功能

为Hexo博客添加LiveRe评论系统

Makefile git add commit push github All in One command

Cross-reference (named anchor) in markdown

Appendix

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
all: git

git:
git add .
git commit -m "$m"
git push

clean:
hexo clean

view:
hexo s -g