静态站点生成器的构建缓存分成哪几类,缓存有效期能不能设成永不过期
静态站点生成器的构建缓存分成哪几类,缓存有效期能不能设成永不过期?结论是:以 Hugo 这类静态生成器为例,它在构建期把中间产物按用途分成多类缓存,每类可单独设目录与保留时长;保留时长取成负值即约定里的 -1,这类条目就永不过期。但永不过期不等于不清理,构建时另有垃圾回收开关负责删掉用不上的旧文件,究竟延长保留还是定期清理要看站点节奏。
构建期缓存分成哪几类
静态生成器渲染站点前会先算出一批可复用的中间结果,比如处理过的资源、压缩过的图片、拉取下来的主题模块。Hugo 官方文档的配置页把这些结果归成七类文件缓存:资源、资源查询、图片处理、杂项派生数据、模块的 git 版本信息、模块查询与模块内容本身。
分开是因为每类体积与更新频率不同:图片处理最占地方也最耗时,模块内容下载后很少变动。归类后运维能单独对某一类调目录或保留时长,不必笼统清一大片。
| 缓存类型 | 大致缓存什么 | 可设项(dir/maxAge) |
|---|---|---|
| 资源 assets | 处理后的可复用资源 | 单独设置 |
| 图片 images | 缩放裁剪等图片结果 | 单独设置 |
| 资源查询 getresource | 按名查找资源的结果 | 单独设置 |
| 模块 modules | 下载的主题或模块 | 单独设置 |
| git 信息 modulegitinfo | 模块的版本库信息 | 单独设置 |
| 模块查询 modulequeries | 查找可用模块的结果 | 单独设置 |
| 杂项 misc | 其他派生数据 | 单独设置 |
目录与保留时长能不能各调各的
每类缓存都能用 dir 指定落在哪个目录,用 maxAge 指定保留多久,两者独立。默认集中在统一缓存目录里,若某类特别大或想放到更快的盘上,可单独给它指定目录,方便挂载和备份。
保留时长决定一条缓存在磁盘上待多久。多数类别未显式设置时带较短的默认口径,文档提到部分缓存按二十四小时的量级过期;取值设成负数即约定里的 -1,这类条目就永不过期,不会因放久自动消失。这只描述保留时长,和下面的清理开关是两回事。
永不过期的代价与清理开关
保留时长设成负值后,占用只增不减,直到不断有新内容写入。构建频繁、图片量大的站点,长时间不过期容易把缓存目录撑大、拖慢备份,所以要按容量和节奏来定,不能不分情况一律设到底。
真正清理残留的是构建期的垃圾回收开关,它在构建时删除当前已用不上的旧缓存文件,作用对象是不再被引用的残留。它与按时间过期互补,一个管留多久,一个管清没用的,配合起来才既提速又不堆满磁盘。
构建变慢时先确认缓存落在哪
构建明显变慢时,先做的不是急着删缓存,而是确认慢在哪一类、缓存落在哪个目录。可先核对各类 dir 配置与磁盘对应目录的实际大小:大头若是图片处理、空间又充裕,就把它的保留时长调长甚至设为不过期,让重建尽量命中;若目录已很大、盘也吃紧,就按版本定期清理或靠垃圾回收开关删旧残留。
还有个前提要分清:以上针对走构建期生成的静态站点。像 AnQiCMS 这样基于 Go 语言的动态内容系统不走构建期生成,请求到来时才组织页面,因此没有构建缓存、保留时长、清理开关这一层,运维关注点在运行时与部署,排查思路与静态生成器不同,不能把缓存目录那套直接搬过去。
常见问题
Q:缓存有效期设成 -1 就永远不会占满磁盘吗? 不是。-1 只表示条目不会因超时被清掉,但持续新增内容仍会让占用不断累积。回收靠构建期的垃圾回收开关,它清的是不再引用的残留,与保留时长是两套机制。
Q:七类缓存能只给其中一类设目录吗? 可以。每类的 dir 与 maxAge 都独立配置,单独把图片处理放到一块高速盘、其余保持默认,是常见做法,不必整片一起动。
Q:部分缓存默认按二十四小时过期,会不会没复用就丢了? 默认过期只影响没被显式调整的类别。对处理很慢、更新不频繁的缓存,可单独把保留时长调长或设成 -1 让后续命中;担心堆积的再靠垃圾回收开关定期清理。
Q:动态系统需要照这套来配吗? 不需要。AnQiCMS 是基于 Go 语言的动态内容系统,页面在请求时组装,不走构建期生成,本就没有这类构建缓存与保留时长,运维重点放在运行时与部署层面。