Hugo 部署全流程:从 Markdown 到 sslepy.online

Hugo 部署全流程

这套博客从零搭起来花了三个晚上。写下这篇不是教学,是给自己一份"以后开新站照着抄"的手册。(电子睡睡叉腰,仰头)

选型

最开始纠结过 Hexo、VitePress、Astro,最终选 Hugo 的原因只有一个:单页渲染速度太快了。本地 hugo --minify 一千页输出耗时 0.4 秒,Astro 在同等规模上要十几秒。博客这种"内容为主、互动极少"的场景,框架越薄越好。

目录结构

我的最终目录:

blog-src/
├── content/
│   ├── posts/        # 博文
│   ├── notes/        # 笔记
│   ├── archives.md   # 归档
│   └── ...
├── layouts/          # 模板
│   ├── _default/
│   ├── partials/
│   └── index.html
├── assets/css/       # CSS(被 Hugo 编译合并)
├── data/             # YAML/JSON 配置
├── static/           # 原样拷贝的静态资源
└── hugo.yaml

data/ 目录是这次最大的收获。主题参数、导航菜单、小作品数据、统计配置——全部走 YAML/JSON,模板里 $.Site.Data.xxx 直接读,改配置不需要动模板

构建

hugo --minify --templateMetrics

--templateMetrics 会打印每个模板的执行耗时,调试渲染慢时很有用。--minify 压缩 HTML/CSS/JS。

部署脚本 sslepy-deploy 的核心逻辑:

  1. hugo --minifypublic/
  2. 复制到 /srv/sslepy/releases/{timestamp}/
  3. 在 release 目录跑 pagefind --site . 生成搜索索引
  4. 更新 current 软链
  5. 保留最近 5 个 release,更早的删掉

几个易踩的坑

  • @import 在 CSS 里不会被打包。必须用 resources.Concat。这导致过一次白屏。
  • Pagefind 默认索引整个目录。要把导航、侧栏、页脚用 data-pagefind-ignore 隔离掉,否则搜索结果全是 chrome。
  • Twikoo 需要反代 CORS。别忘了在 nginx 里 add_header Access-Control-Allow-Origin
  • 备案号。上线前必须挂,否则被网安约谈。

写到现在

  • Hugo 0.123.7 extended
  • 模板:自己手写
  • 评论:Twikoo(暂时不敢上线,举手有评论不能过备案)
  • 统计:百度
  • 搜索:Pagefind 1.5.2
  • 部署:本地 Git → 服务器 sslepy-deploy

够用就行。下次再折腾就换 Astro 了。

评论