PAYATHON 2026

如何禁止 Next.js 在构建完成后写入缓存?

技术老齐

支持。使用 Turbopack 构建时,可以在 next.config.ts 中设置 experimental.turbopackFileSystemCacheForBuild: false,关闭构建阶段的文件系统缓存。

Turborepo 也会输出 Finishing writing to cache... 这条提示。如果通过 turbo run build 执行构建,还需要检查 Turborepo 的任务缓存。只修改 Next.js 配置,可能无法消除这段等待。相关日志示例

关闭 Next.js 的 Turbopack 构建缓存

将以下配置合并到项目已有的 next.config.ts 中:

import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  experimental: {
    turbopackFileSystemCacheForBuild: false,
  },
}

export default nextConfig

如果已有其他 experimental 选项,保留原有设置,只添加这一项。保存后,重新执行原来的构建命令。

这个选项控制 next build 使用的 Turbopack 文件系统缓存。开发服务器的缓存由 turbopackFileSystemCacheForDev 控制,关闭构建缓存时无需修改它。Next.js 官方配置文档

为什么需要区分 Next.js 16 的具体版本

Turbopack 会把编译工作保存到磁盘,供后续构建复用,因此缓存可能有助于频繁重复构建。关闭缓存可以省去相关写入,但后续构建也需要重新完成原本可以复用的工作。总耗时能否减少,要看项目情况。

根据官方版本记录,构建和开发缓存的独立配置项在 Next.js 16.0.0 中进入 Beta,构建缓存从 16.3.0 开始默认开启。判断项目是否默认启用了构建缓存,需要确认具体版本,不能只看是否使用 Next.js 16。官方版本记录

如果提示来自 Turborepo

先查看 package.json 中的构建脚本。如果执行的是 turbo build 或 turbo run build,Turborepo 会在 Next.js 构建之外管理一层任务缓存。

如果当前 Turborepo 版本支持 --cache 参数,可以让本次执行只读取缓存,不再写入:

npx turbo run build --cache=local:r,remote:r

其中 r 表示只读。要完全禁用本次执行的本地和远程任务缓存,可以使用:

npx turbo run build --cache=local:,remote:

这些参数只控制 Turborepo 的任务缓存,Next.js 内部的 Turbopack 缓存仍由 Next.js 配置控制。Turborepo 命令文档

如果要持续禁用 build 任务的缓存,可以在已有 turbo.json 的对应任务中加入:

{
  "tasks": {
    "build": {
      "cache": false
    }
  }
}

合并配置时,保留任务原有的 dependsOn 等设置。设置 "cache": false 后,该任务每次都会实际执行,并停止缓存输出。Turborepo 配置文档

注意事项

  • turbopackFileSystemCacheForBuild 只适用于 Turbopack,无法解决 webpack 构建的缓存问题。
  • 关闭编译缓存后,Next.js 仍会生成正常的 .next 构建产物。这个选项无法禁止所有磁盘写入。
  • 不要用 turbo run build --force 代替关闭缓存。--force 会忽略已有缓存并重新执行任务,但仍会写入缓存。--force 的官方说明

备注:内容仅供参考。