说来惭愧,我的博客已经荒废许久,上一篇是在两年前折腾 hexo 的时候。后来不更新的原因一方面当然是因为懒,另一方面是觉得当时搭起来的博客有两个硬伤:
- 编译速度慢。hexo 的编译速度是我最忍受不了的地方,随便加一点东西都要编译半天。而且 hexo 使用的 nodejs 依赖关系显得有些复杂。
- 不能自动部署。我需要同时维护博客源码和生成的静态网站源码,既要把博客源码 push 到 github 上去,还要把输出的网站源码也 push 上去。编译已经很慢了,再维护两份代码仓库就更让人心烦。
前段时间我脑子一热又想写博客了,于是在网上搜了一下,发现这两个问题都可以解决了。
第 1 个问题的解决方案是 hugo。hugo 是 hexo 的完美替代,它是用 golang 编写的,最大的优点就是快,编译几乎是秒速。而且 hugo 完全没有其他依赖,只需要一个可执行文件,简直就是我的理想型。
第 2 个问题,可以用 github actions 解决。有现成的 github actions 可以实现 hugo 的自动部署,本地只需要维护博客仓库就可以了,push 到 github 时会触发 github actions 帮我们执行编译并部署到 github-pages 的操作,详见我的另一篇博文。
记录一下 hugo 搭建过程中遇到的一些新的概念和问题。
内容管理
分区
hugo 的文章都放在 content 目录下,采用 sections 管理文章的分类。sections 的组织结构是遵循你的目录结构的,每个目录都是一个分区。你的文章所在分区是由它的位置决定的,你无法在文章的 metadata 中修改它的分区。
content 根目录下的每个文件夹会自动成为一个分区。如果文件夹不在 content 根目录下,那么需要新建一个 _index.md 文件使它成为分区。分区和目录一样是树状结构,因此很适合作为文章的分类使用,比 hexo 在文章中使用 categories 指定分类要更科学些。
content
├── life/
└── tech/
├── cpp/
│ └── _index.md
└── misc/
如上的目录结构中,有 life 和 tech 两个分区,而 tech 下又有 cpp 子分区。misc 不是分区,因为它既不在根目录下,也没有 _index.md
文件。_index.md
文件 metadata 中的 title 可以指定分区名。
URL 管理
首先需要在 config.toml 中的 baseURL
指定网站的 url:
= "https://example.com/"
如果你有一个 content/posts/article.md
文件,编译后输出的对应 url 是 https://example.com/posts/article/
。
如果你要让文件命名为中文,而生成的 url 为英文,可以用 slug
指定。比如你有一篇文章 content/posts/引言.md
,在文章的 metadata 中添加:
---
title: "引言"
slug: "introdution"
---
这样文件名和显示的文章名都是中文,而对应的 url 变为 https://example.com/posts/introdution/
。
图片资源
图片位置以及引用方法有两种:
- 所有的图片都放在
static/images
目录下,markdown 文件中通过路径![](/images/XXX.png
引用 - 图片和 markdown 文件放在一起。在同一目录下建立一个和 markdown 文件同名的文件夹,把图片放在里面,用相对路径引用:
![](XXX.png)
。也可以把一篇文章和它的其他资源文件放在同一个单独的文件夹里,比如文章写在/posts/article/index.md
中,图片位于/posts/article/img.png
,这样也可以直接在文章中用相对路径引用![](img.png)
。
主题 MemE
用 hexo 的时候使用的是 NexT 主题,既然换了 hugo 就想尝试点新鲜的。我无意间点进了reuixiy 的博客(怎么点进去的我已经忘了),觉得这个博客的主题 MemE 简洁而优雅,很符合我的审美 (假设我有),就决定是它了。