NextJS是否会对fetch请求的invalidatedTags执行存储垃圾回收?
关于失效标签的垃圾回收
Next.js 默认不会主动对标记为失效(invalidated)的缓存标签执行自动垃圾回收,这些失效的缓存对象会一直保留在磁盘的缓存目录中,除非你手动清理或者触发了缓存容量淘汰机制。
手动删除失效缓存对象的方法
直接清理整个fetch缓存目录
Next.js 的fetch缓存默认存在.next/cache/fetch-cache目录下,你可以直接删除这个目录来清空所有缓存(包括失效的)。在终端执行对应命令:- Linux/macOS:
rm -rf .next/cache/fetch-cache - Windows:
rd /s /q .next\cache\fetch-cache
也可以把这个命令加到package.json的脚本里,比如:
"scripts": { "clean-cache": "rm -rf .next/cache/fetch-cache", "dev": "npm run clean-cache && next dev" }- Linux/macOS:
配置缓存容量上限触发自动淘汰
在next.config.js中可以设置缓存的磁盘和内存容量上限,当缓存达到设定值时,Next.js 会自动删除最久未使用的缓存条目(包含失效的对象):/** @type {import('next').NextConfig} */ const nextConfig = { experimental: { cacheMemoryCapacity: 52428800, // 50MB cacheDiskCapacity: 2147483648 // 2GB } } module.exports = nextConfig运行时动态清理特定标签的缓存
如果你需要精准清理某个标签对应的失效缓存,可以通过解析缓存目录的元数据文件来定位并删除对应缓存。缓存的元数据存在.next/cache/fetch-cache/metadata文件夹下,每个缓存条目会关联对应的标签。你可以写一个工具函数或API路由,读取元数据找到目标标签对应的缓存文件哈希,再删除对应的缓存文件。比如:import fs from 'fs/promises' import path from 'path' async function deleteCacheByTag(tag) { const metadataDir = path.join(process.cwd(), '.next/cache/fetch-cache/metadata') const files = await fs.readdir(metadataDir) for (const file of files) { const filePath = path.join(metadataDir, file) const content = await fs.readFile(filePath, 'utf8') const metadata = JSON.parse(content) if (metadata.tags.includes(tag)) { // 删除对应的缓存文件 const cacheFile = path.join(process.cwd(), '.next/cache/fetch-cache', file) await fs.unlink(cacheFile) // 删除元数据文件 await fs.unlink(filePath) } } }注意:这种方式依赖Next.js的缓存目录结构,未来版本可能有变动,使用前做好测试。
内容的提问来源于stack exchange,提问作者Wisam Jbori
相关产品推荐
相关产品推荐

