花了点时间,把blog从hexo迁移到了hugo,这下终于舒服了
动机 #
过去一段时间都在用P.A.R.A方法来管理我的所有资料,用坚果云来跨设备同步,但一直有个编外Project,就是这个博客站。
hexo很方便,但基于node.js的项目都会有一个node_modules文件夹用于存放模块依赖,如果把整个博客项目文件夹放进我的P.A.R.A体系,坚果云就会开始同步文件夹内所有的文件,包括这个node_modules…洁癖作祟,我不希望我的P.A.R.A体系被node_modules这种环境依赖污染。
一开始在想,坚果云应该有类似于gitignore的配置,可以忽略特定的文件/文件夹。搜索发现mac下有个配置文件:~/.nutstore/db/customExtRules.conf可以满足这个需求,但官方链接已经404,咨询客服,回应说为了客户端同步稳定性已经把功能关闭,担心引发意料之外的问题,放弃这种方式。
于是目光投向了Hugo,
| 对比维度 | Hexo(基于 Node.js) | Hugo(基于 Go) |
|---|---|---|
| 构建速度 | ⚠️ 中等偏慢:文章数量多时(>1000 篇)生成耗时较长 | ✅ 极快:万级页面秒级生成,Go 并发优势显著 |
| 上手难度 | ✅ 简单:命令直观,YAML 配置友好,适合新手 | ⚠️ 较高:需学习 Go 模板语法(如 {{ range }}),逻辑稍复杂 |
| 主题生态 | ✅ 极其丰富:大量高质量中文/英文主题,高度可定制 | ⚠️ 相对较少:主题精美但数量有限,部分功能需自行实现 |
| 插件支持 | ✅ 插件生态成熟:SEO、评论、统计、搜索等插件齐全 | ⚠️ 插件机制弱:多数功能需通过模板或自定义脚本实现 |
| 本地预览 | ✅ 支持热更新,写作体验流畅 | ✅ 同样支持热更新,且启动更快 |
| 部署便捷性 | ⚠️ 依赖 Node.js + npm,换环境需重装依赖,可能有版本冲突 | ✅ 零依赖:单个可执行文件,跨平台即用,部署极简 |
| 社区与文档 | ✅ 中文社区活跃,教程丰富,问题易解决 | ⚠️ 英文文档完善,但中文资料较少,社区相对小众 |
| 适用场景 | 个人博客、中小型站点、注重外观与功能扩展的新手用户 | 大型博客、技术文档站、性能敏感型用户、追求高效与简洁的开发者 |
| 维护成本 | ⚠️ 较高:需管理 Node 环境和 npm 包,长期维护可能遇到兼容性问题 | ✅ 极低:无外部依赖,升级只需替换二进制文件 |
| 让AI列出了表格对比,显然在依赖管理这方面,Hugo更能解决我的痛点,其他问题在AI时代都已经不是问题了 |
采用Github Pages的项目站点 #
软件工程上,要保证迁移过程的平滑,不影响正常访问,其实不外乎几步
- 新起一个项目,
- 内容迁移到新项目,
- 准备就绪后,把访问路由到新的项目
一直在用github pages,足够方便还想继续用,但就会和正在用的域名起冲突。搜索才发现,原来github pages还分用户站点和项目站点,即username.github.io 以及username.github.io/repository。(这下终于知道为什么偶尔刷到一些网站,有着同样的username.github.io但不同的路径却有不一样的功能了,估计用的都是项目站点)。显然,项目站点能保证迁移的平滑,我只需要在项目站点准备好之后,把域名改成项目站点即可。
还有一个需求,github pages要求代码仓库是public的,付费才可以用private仓库来发布pages,如果我想保持源内容私有,只公开hugo生成的静态网页,又不想付费怎么办?答案是Github Action,可以配置在提交代码的时候,往另一个仓库写入内容
# .github/workflow/.deploy.yml
name: Deploy Hugo site to GitHub Pages
on:
push:
branches: ["master"]
workflow_dispatch: # 手动触发也可以
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: "latest"
extended: true
- name: Build
run: hugo --minify
- name: Deploy to public repo
run: |
cd public
git init
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "Deploy from private source repo"
git branch -M gh-pages # 或者 gh-pages,看你用哪个分支做 Pages
git remote add origin https://x-access-token:${{ secrets.HUGO_GITHUB_PAGES }}@github.com/username/repository.git
git push -f origin gh-pages
注意:@github.com/username/repository.git需要调整,也得配置访问另一个仓库的Tokensecrets.HUGO_GITHUB_PAGES。(其实都是让Cursor写的)
使用Cursor轻松完成迁移 #
接下来就是内容迁移环节了,迁移文章,最重要的是保持seo权重,还有各种front matter 以及内部文章引用语法等等,搜索自然能找到对应的教程,但自己研究细节并且逐篇修改,费时费力。AI时代,当然交给AI,这也是整个迁移过程最惊喜的地方!
把两个博客站点文件夹加到同一个workspace里,跟Cursor说,这是个Hexo博客目录,帮我迁移到这个Hugo博客目录中,去刷个牙回来,Cursor居然就迁移完了?!而且还会自己写python脚本来处理每一篇文章。结果很完美,文章永久链接这种该有的都有了,甚至,把文章以及配图等本地文件引用都放到同一个slug目录下,这种超出预期的行为都有了,过程丝滑的毫无体验感,真香!
而且之前一直嫌弃给文章打标签太麻烦,现在完全可以让Cursor来打标签呀,于是三两下,标签也有了…最多再根据自己喜好改改。用了BlowFish主题,有些个性化配置例如网站favicon等不知道怎么弄,直接问Cursor就给出了方案…
嗯,基本离不开Cursor这类AI工具了