从 Hexo / Jekyll 迁移到 Hugo:实际踩坑清单(2026-08)
0. 透明披露
- 本文不推广任何云服务、域名或联盟;
- 迁移数据全部来自本人实验性博客,无第三方真实站点数据;
- 不放任何带 PID 的推广链接。
1. 为什么从 Hexo 迁到 Hugo
| 维度 | Hexo | Hugo |
|---|---|---|
| 引擎 | Node.js(需 Node 18+) | 单文件 Go 二进制 |
| 构建速度 | 200–500 ms/页(10 篇文章 ~6 s) | 138 ms / 全站 135 页 |
| 内存 | Node 启动 200 MiB+ | Hugo 启动 30 MiB |
| 主题 | 生态大但常 broken | 自写 templates,零依赖 |
| 安装 | npm i + node_modules | wget 一行 |
对 1.6 GiB 内存机器,Hugo 是唯一选择。
2. Front Matter 差异(最容易踩的坑)
Hexo 默认 Front Matter:
| |
Hugo 默认 Front Matter(TOML 或 YAML):
| |
关键差异:
- Hexo 时间格式不带时区,Hugo 强烈建议带
+08:00,否则按 UTC; - Hexo
categories是单字段,Hugo 是数组; - Hexo
tags是数组,Hugo 也必须是数组(单字符串会报错)。
转换脚本(一行 sed):
| |
3. 永久链接(Permalinks)
Hexo 默认:/2026/01/01/title/
Hugo 默认:/title/
要在 Hugo 还原 Hexo 永久链接(保 SEO 继承):
| |
⚠️ 永久链接改了必须同时做 301 重定向,否则百度/Google 全部 404。
4. 文章目录结构
Hexo:source/_posts/标题.md
Hugo:content/posts/标题.md
需要手动迁移 + 把文件名 slug 化(去掉中文、保留日期作为前缀):
| |
5. 标签和分类页
Hexo 自动生成 tags/标签名/、categories/分类名/。
Hugo 默认不生成,需要在模板里手动写:
| |
6. 资源目录(图片)
Hexo:source/_posts/images/foo.png,引用 。
Hugo:必须放进同名的 index.md 旁边的目录,否则 404:
| |
引用改成  不变。
7. 构建脚本
把 Hexo 的 hexo generate 换成 Hugo 的 hugo --gc:
| |
8. 部署方式对比
| 部署方式 | Hexo | Hugo |
|---|---|---|
| GitHub Pages | ✅ | ✅ |
| Netlify | ✅ | ✅ |
| Vercel | ✅ | ✅ |
| 自建 Nginx / Caddy | ✅(需 node) | ✅(纯静态) |
9. 我的实际选择
- 已完成迁移:12 篇 posts + 12 个工具单页已搬到 Hugo;
- 不保留 Hexo 备库:删除
node_modules,节省 250 MiB 磁盘; - 下一步:等工具箱 ≥ 15 篇 + 备案通过后,绑定 .com 域名。
10. 常见踩坑 FAQ
Q:Hugo 构建报 “unmarshal error”? A:99% 是 Front Matter 缩进问题,YAML 不允许 Tab 缩进。
Q:永久链接改完之后旧链接全 404?
A:必须配 Nginx/Caddy 301 重定向,参考 caddy 工具单页。
Q:图片在本地能看,部署后 404?
A:Hugo 的 page bundle 必须用同名目录 + index.md,不能把图片扔到 static/ 就引用。
缺点限制
- Hugo 的
related推荐算法比 Hexo 弱; - Hugo 没有 Hexo 的
next/prev自动生成,需要自写 partial; - Hugo 主题生态远不如 Hexo,需要自包含 templates。
替代方案
- 继续用 Hexo:内存 ≥ 4 GiB 时完全 OK;
- 迁移到 Astro:构建速度接近 Hugo,但生态更现代;
- 迁移到 Zola:类 Hugo,Rust 写的,国内案例少。