Featured image of post Hugo 博客优化实录:瘦掉 221MB 死图与几个小坑

Hugo 博客优化实录:瘦掉 221MB 死图与几个小坑

一次 Hugo 博客体检:仓库里躺着 221MB 无人引用的封面原图、robots.txt 是 404、语言码打架、分页写法已弃用……记录排查与修复全过程。

   
文章摘要
博客跑得好好的,一查才发现仓库里躺着 221MB 没人用的封面原图、robots.txt 竟然是 404、语言码还对不上。这篇记录一次 Hugo 博客体检与优化的全过程,附踩过的坑。

这个博客用 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/random221MB744KB
robots.txt404200
语言码en-us(冲突)zh-CN
分页弃用写法pagination.pagerSize
封面加载偶发 404/403唯一 token 稳 200

首页、文章页、sitemap 复检全部 200,封面正常,站点反而更轻了。

小结

Hugo 这类静态站“跑起来”很容易,但仓库卫生和配置细节最容易被忽略:一堆没人引用的历史图片、忘了开的 robots、对不上的语言码、过期的配置字段……不会立刻出错,却一直在悄悄拖后腿。定期体检一遍,收益比想象中大。

晚来天欲雪,能饮一杯无