跳过正文

博客迁移,从hexo到hugo

·2116 字·5 分钟
月半杰瑞
作者
月半杰瑞
软件工程师·独立开发者
目录

花了点时间,把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工具了