这个博客用 Hugo + hugo-magic 主题,托管在 Vercel(GitHub Actions 构建后发布静态站),跑了 70 多篇文章,平时访问也就 0.4s、gzip 后首页 8KB,看着挺好。但顺手做了一次体检,还真翻出几个“平时感觉不到、一看吓一跳”的问题。记录一下,也给同样用 Hugo 的朋友提个醒。
一、最大坑:仓库里躺着 221MB 没人用的图
体检第一步看仓库体积,.git 竟然有 262MB。查下来 static/images/random/ 目录里塞了 182 张本地原图,合计 221MB(还有几张 13MB+ 的 PNG)。
但诡异的是——全站没有任何文章或模板引用这些本地图。因为这个博客的随机封面早就改成走 jsd 图床远程加载(random-<id>.jpg/png),本地这些图纯属历史遗留的“源文件”,躺在 static/ 里陪跑:
- 每次 GitHub Actions 都要把这 221MB 一起 clone + 构建
- 部署包白白变大,逼近 GitHub Pages 的体积上限
- 仓库越滚越臃肿
处理:先备份,再移除
图不能直接删——万一哪天图床挂了还得靠本地。所以先把 182 张原图复制到仓库外的备份目录,校验 MD5 全部一致后再从 git 移除,只保留封面需要的 <id>.json 元数据和 available.txt 白名单:
BK=~/博客/封面原图备份
mkdir -p "$BK"
cp -n static/images/random/*.jpg static/images/random/*.png "$BK"/
# 校验数量 + MD5 一致后,再从仓库删除
git rm static/images/random/*.jpg static/images/random/*.png
效果立竿见影:static/images/random 从 221MB → 744KB。现在封面有三重保险:本地备份 + 图床仓库 + jsd 线上。
注意:
.git历史里的旧 blob 还在(265MB),工作区瘦了但历史没瘦。要连历史一起清得用git filter-repo改写历史 + 强推,风险高,按需再做。
二、robots.txt 居然是 404
一直以为有,结果 curl /robots.txt 返回的是 404 页面。原因是 hugo.yaml 里没开 enableRobotsTXT,Hugo 默认不生成。
enableRobotsTXT: true
加上后重新部署,/robots.txt 正常返回 User-agent: *,爬虫和搜索引擎都能正常读了。
三、语言码对不上
配置里 languageCode: en-us,但默认内容语言是 zh-cn——两个打架。这会让 <html lang> 和一些 SEO 元信息标错语言:
languageCode: zh-CN
四、分页写法已弃用
老配置用的是 paginate: 6,这个字段在 Hugo 0.127 已弃用,将来升级会失效。改成新写法:
pagination:
pagerSize: 6
五、顺手开 minify
minify:
minifyOutput: true
坦白说收益不大——因为 Vercel 本来就会 gzip,首页 gzip 后已经 8KB 左右;minify 主要压的是未压缩体积。想要极致可以在构建命令里加 hugo --minify。
附:随机封面的 jsd 缓存坑
优化过程中还踩到一个图床的坑值得记一笔:jsd(jsDelivr 镜像)会把错误响应也缓存成 immutable(一年)。如果某个封面 URL 在文件还不存在时被访问过,之后即使图上传了,这个 URL 也会一直 404/403。
更坑的是,连带 ?v=<id> 的查询串也会被逐 id 单独污染——实测同一个 ?v=20261027 对 116 号图变成 403,换个新 token 就 200。所以最终方案是:每条文章生成时用一个全新的唯一 token(Hugo archetype 里取 now.UnixNano),保证每个封面 URL 都是全新缓存键,稳定 200。
结果
| 项 | 优化前 | 优化后 |
|---|---|---|
static/images/random | 221MB | 744KB |
| robots.txt | 404 | 200 |
| 语言码 | en-us(冲突) | zh-CN |
| 分页 | 弃用写法 | pagination.pagerSize |
| 封面加载 | 偶发 404/403 | 唯一 token 稳 200 |
首页、文章页、sitemap 复检全部 200,封面正常,站点反而更轻了。
小结
Hugo 这类静态站“跑起来”很容易,但仓库卫生和配置细节最容易被忽略:一堆没人引用的历史图片、忘了开的 robots、对不上的语言码、过期的配置字段……不会立刻出错,却一直在悄悄拖后腿。定期体检一遍,收益比想象中大。
