中秋节假日期间,得空将过去基于Hexo的个人博客迁移到了Hugo体系,迁移的原因不外乎两个:
- Hexo页面生成越来越慢了,不到100篇博文花了5秒,Hugo则是出名的快,体验更好;
- Hugo位于Golang生态,三方工具也很丰富,至少,没有比Hexo差太多。
此外,Golang是我近两年的主语言,用上Hugo之后若遇到问题,我应该有能力解决。
由Hexo迁移至Hugo
在Hexo下,我有两个站点:主站(www.slackideas.com)和子站(www.slackideas.com/PostgresWorld)。
→ tree .
.
├── Adaptance.md
├── A-Glance-Through-the-Window-of-Office-Two-Pictures
│ ├── A.png
│ ├── B.png
├── A-Glance-Through-the-Window-of-Office-Two-Pictu.md
...
→ tree postgresworld/
postgresworld/
├── best_practice_auto_partitioning.md
├── weekly_updates_2022w01.md
├── weekly_updates_2022w02.md
...
借这次迁移的机会,顺便将两站合二为一,以后就更方便维护了。想要完成这个目标,需要做两件事:
- 原Hexo博客的markdown文章要迁移至Hugo
- 原来文章的URL不能变,也就是说,Hugo这里要适配2套URL
文章和图片的迁移
文章好说,都是markdown文件,挪一下位置就行。
图片怎么办?Hexo下面带图文章的管理是这样的,带图的文章会存在一个同名目录,目录中放置与该文章相关的本地图片。Hugo下面的带图文章管理则是,文章和图片都放在一个目录中,文章命名index.md,图片采用相对路径引用(即如./1.png
)。
按照这个规则,写了shell脚本一键迁移文章和脚本。
#!/usr/bin/env bash
SCRIPT_PATH=$(cd `dirname $0`; pwd)
cd $SCRIPT_PATH
cp=/usr/bin/cp
# 源Hexo的文章目录
SRC=source/_posts
# 对应目标Hugo的content/posts目录
DST=source/hugo_posts
mkdir -p $DST
/usr/bin/rm -rf $DST/*
for item in `ls $SRC`; do
# 对于有本地图片的文章,将(图片)目录先行拷贝迁移
if [ -d $SRC/$item ]; then
$cp -r $SRC/$item $DST/
fi
done
for item in `ls $SRC`; do
if [ -f $SRC/$item ]; then
# 对于有本地图片的文章,文件需改名index.md
if [ -d $DST/${item%%.*} ]; then
$cp -f $SRC/$item $DST/${item%%.*}/index.md
else
# 对于没有本地图片的简单文章,直接拷贝迁移
$cp -f $SRC/$item $DST/
fi
fi
done
URL适配
Hugo支持对content的不同子目录,设置不同的permalink,我采用如下配置将原本主站和子站的URL模式保留不变。
// 取消URL路径自动小写
disablePathToLower: true
permalinks:
// posts目录存放主站的文章和图片
posts: "/:year/:month/:day/:slug/"
// postgresworld目录存放PostgresWorld子站的文章和图片
postgresworld: "/PostgresWorld/:year/:month/:day/:filename/"
Google网站统计
Hugo内置了Google Analytics模板,使用方式如下:
- 在主题模板的合适位置添加模板引用代码
{{ template "_internal/google_analytics_async.html" . }}
- 在Hugo配置中添加Google Analytics ID(在GA账号页-管理-媒体资源-数据流中可查看)
googleAnalytics: "G-XXXXXXX"
utterances评论
utterances的介绍:
A lightweight comments widget built on GitHub issues. Use GitHub issues for blog comments, wiki pages and more!
在官方主页做好配置后,将script脚本添加到主题模板的合适位置即可。