Skip to content

Hugo 缓存策略配置

问题说明

useResourceCacheWhen 的三个值

Hugo 的 useResourceCacheWhen 配置有三个值:

行为 适用场景
never 从不使用缓存 调试缓存问题
fallback 首选源文件,不存在时用缓存 本地开发
always 优先使用缓存 生产构建

遇到的问题

当在配置文件中设置 useResourceCacheWhen = "always" 后,本地开发会报错:

ERROR POSTCSS: failed to transform "/css/combined.css" (text/css): 
resource "css/combined.css_xxx" not found in file cache

原因

  1. always 策略要求缓存必须存在
  2. 本地运行 npm run clean:cache 删除了缓存
  3. Hugo 尝试从缓存加载资源但找不到
  4. 构建失败 ❌

解决方案

方案:环境变量 + fallback 默认值

配置文件config/_default/config.toml):

[build]
# 本地开发使用 fallback(首选源文件)
useResourceCacheWhen = "fallback"

Cloudflare Pages 环境变量

Name: HUGO_RESOURCECACHEWHEN
Value: always
Environment: Production

工作原理

  • 本地开发:使用 fallback,清理缓存后可以正常构建
  • 生产环境:环境变量覆盖配置,使用 always,利用缓存加速

配置步骤

1. 修改配置文件

config/_default/config.toml

[build]
# 缓存策略:
# - "fallback": 首选源文件,源文件不存在时使用缓存(本地开发推荐)
# - "always": 优先使用缓存(Cloudflare Pages 生产环境通过环境变量设置)
# 本地开发使用 fallback 避免缓存问题
# 生产环境通过 HUGO_RESOURCECACHEWHEN=always 环境变量使用 always
useResourceCacheWhen = "fallback"

# Hugo 缓存配置 - 加速重复构建
[caches]
  [caches.getjson]
    dir = ":resourceDir/_cache/getjson"
    maxAge = "24h"

  [caches.images]
    dir = ":resourceDir/_cache/images"
    maxAge = "168h"

  [caches.assets]
    dir = ":resourceDir/_cache/assets"
    maxAge = "168h"

  [caches.modules]
    dir = ":cacheDir/modules"
    maxAge = "168h"

2. 配置 Cloudflare Pages

进入:Dashboard → Pages → jimmysong.io → Settings → Environment variables

添加两个环境变量:

a. Python 依赖优化

在生产构建中,如果不需要安装完整的本地开发 Python 依赖,可以通过环境变量跳过安装:

Name: SKIP_DEPENDENCY_INSTALL
Value: true
Environment: Production

然后在构建脚本中根据该变量有条件地安装依赖,例如:

if [ "$SKIP_DEPENDENCY_INSTALL" != "true" ]; then
  pip install -r requirements.txt
else
  echo "SKIP_DEPENDENCY_INSTALL=true - skipping python dependency installation"
fi

b. Hugo 缓存策略

Name: HUGO_RESOURCECACHEWHEN
Value: always
Environment: Production

验证

本地开发

# 清理缓存后构建应该成功
npm run clean:cache
npm run build
# ✅ 成功!使用 fallback 策略

# 再次构建(有缓存)也应该成功
npm run build
# ✅ 成功!使用缓存加速

Cloudflare Pages

查看构建日志:

...
Hugo environment: production
HUGO_RESOURCECACHEWHEN=always  ← 环境变量生效
...
Start building sites …
...
Total in 60000-70000 ms  ← 使用缓存,快!

缓存目录结构

resources/
├── _cache/           # Hugo 缓存(由我们配置)
│   ├── getjson/      # JSON 数据缓存
│   ├── getcsv/       # CSV 数据缓存
│   ├── images/       # 图片处理缓存
│   ├── assets/       # SCSS/JS 编译缓存
│   └── modules/      # Hugo 模块缓存
└── _gen/             # Hugo 生成的资源(自动)
    ├── assets/       # 编译后的 CSS/JS
    └── images/       # 处理后的图片

不同场景的行为

场景 1:本地首次构建

npm run clean:cache  # 删除 resources/ 和 public/
npm run build

行为

  • useResourceCacheWhen = "fallback"
  • 没有缓存,从源文件处理
  • 生成资源到 resources/_gen/
  • 保存缓存到 resources/_cache/
  • ✅ 构建成功

场景 2:本地重复构建

npm run build  # 不清理缓存

行为

  • useResourceCacheWhen = "fallback"
  • 优先从源文件处理(fallback 策略)
  • 如果源文件未变化,使用缓存
  • ✅ 构建成功,有一定加速

场景 3:Cloudflare Pages 首次构建

npm run build  # 在 CF Pages 环境

行为

  • HUGO_RESOURCECACHEWHEN=always 环境变量覆盖配置
  • 没有缓存,从源文件处理(always 策略的 fallback)
  • 生成并保存缓存
  • Cloudflare Pages 缓存 resources/ 目录
  • ✅ 构建成功

场景 4:Cloudflare Pages 后续构建

npm run build  # 在 CF Pages 环境

行为

  • Cloudflare Pages 恢复 resources/ 缓存
  • HUGO_RESOURCECACHEWHEN=always
  • 优先使用缓存,跳过重复处理
  • 只处理变化的文件
  • ✅ 构建成功,显著加速

性能对比

场景 缓存策略 Hugo 构建时间
本地开发 fallback ~30 秒(小项目)
本地开发 fallback + 缓存 ~25 秒
CF Pages 首次 always(无缓存) ~85 秒
CF Pages 后续 always + 缓存 ~60-70 秒

故障排查

问题 1:本地报错 "not found in file cache"

原因:配置文件中使用了 always 策略

解决

# 1. 改回 fallback
vim config/_default/config.toml
# useResourceCacheWhen = "fallback"

# 2. 清理缓存重新构建
npm run clean:cache
npm run build

问题 2:Cloudflare Pages 没有使用缓存

检查

  1. 环境变量 HUGO_RESOURCECACHEWHEN=always 是否设置
  2. 构建日志中是否显示环境变量
  3. Hugo 构建时间是否减少

解决

  • 在 Cloudflare Pages Dashboard 添加环境变量
  • 确保设置在 Production 环境
  • 保存并触发新构建

问题 3:缓存配置不生效

检查

# 查看 Hugo 版本
hugo version
# 需要 v0.147.8+

# 查看缓存目录
ls -la resources/_cache/

确认配置

[caches]
  [caches.images]
    dir = ":resourceDir/_cache/images"  # 路径正确
    maxAge = "168h"                     # 过期时间合理

最佳实践

1. 本地开发

# 正常构建(保留缓存)
npm run build

# 遇到问题时清理缓存
npm run build:clean

2. 生产部署

# 确保配置
# 1. config.toml: useResourceCacheWhen = "fallback"
# 2. CF Pages 环境变量: HUGO_RESOURCECACHEWHEN=always

# 推送代码
git push origin main

# Cloudflare Pages 自动构建,使用缓存优化

3. 调试缓存

# 查看缓存内容
ls -la resources/_cache/*/

# 查看缓存大小
du -sh resources/_cache/

# 完全清理
npm run clean:full
npm install
npm run build

环境变量优先级

Hugo 配置优先级(从高到低):

  1. 环境变量HUGO_RESOURCECACHEWHEN=always
  2. 配置文件config.toml 中的 useResourceCacheWhen
  3. 默认值fallback

这就是为什么我们可以:

  • 配置文件使用 fallback(本地开发友好)
  • 生产环境用环境变量覆盖为 always(性能优化)

总结

最佳配置方案

  1. 配置文件useResourceCacheWhen = "fallback"
  2. 本地开发友好
  3. 清理缓存后可以正常构建

  4. Cloudflare Pages 环境变量HUGO_RESOURCECACHEWHEN=always

  5. 生产环境优化
  6. 利用缓存加速构建

这样既保证了本地开发的灵活性,又实现了生产环境的性能优化!🎉