• 问题: 三天里,Mint 把同一个 node_modules 删了 11 次,每次都又回来了。它还删了 35.4 GB 的 AI 模型,其中 34.3 GB 被重新下载。
  • 我们发现: 我们的规则只问这个文件夹能不能重建。可项目一直在用,这几次删除腾出的 7.68 GB 全部回来了,净收益为零。
  • 我们做了什么: 模型现在在 Safe to clean 里有了自己的分类,永远不会替你勾选。最近七天用过的 node_modules 会归到 Keep,这项改动已随 Mint 1.0.91 发布。

删 node_modules 在一个意义上是安全的:什么都不会丢,npm ci 能按锁文件把它装回来。能不能腾出空间,要看这个项目还在不在用。我们的还在用。9 月 29 日到 10 月 2 日之间,Mint 把同一个 node_modules 删了 11 次,每次它都回来了,其中 5 次不到 20 分钟就回来。同样这三天,Mint 删掉了 35.4 GB 下载好的 AI 模型,其中 34.3 GB 又被重新下载。

这篇记的是我们自己的清理工具问错了问题。它问“这个能重建吗”,要紧的却是“一小时内会不会有东西把它重建出来”。

这个文件夹

它属于我们做视频用的项目,渲染离不开它:334 MB 的依赖包,197 MB 的无界面 Chrome(视频工具第一次渲染时下载),再加 176 MB 的渲染缓存,一共约 730 MB。

Mint 把它列进 Safe to clean,是因为它符合我们当时的规则:旁边有锁文件的 node_modules 可以重装。这条规则不管项目最后一次用是什么时候。而从 9 月下旬起,Safe to clean 打开时每一行都是勾选的,所以每次有人打开它,这个文件夹都已经被勾上了。

删了 11 次

每一次都是有人在 Mint 的 Disk 页面里手动发起的清理,每一次都是永久删除,没有一次来自 Auto Care。时间为太平洋时间。下面三列依次是:删除时间、距上次安装多久、多久后回来(h 为小时,m 为分钟):

Sep 29 23:31   8h 20m             11m
Sep 30 12:15   12h 32m            2h 18m
Sep 30 14:42   9m                 13m
Sep 30 18:47   3h 53m             2h 9m
Oct 1  00:39   3h 42m             17m
Oct 1  12:49   11h 53m            4h 39m
Oct 1  18:01   33m                12m
Oct 1  21:48   3h 35m             1h 43m
Oct 2  00:40   1h 9m              13h
Oct 2  14:12   33m                19m
Oct 2  15:51   1h 19m             6h 7m

“距上次安装”是从前一次重装算起的时间。被删时,这个文件夹的年龄中位数是 3 小时 35 分;再次出现前,等待时间的中位数是 1 小时 43 分。最短的一次,它才装好 9 分钟。

这 11 次一共腾出 7.68 GB,又全部回来了,净收益是零。每次重装都很快,257 个包用 4 到 11 秒,但不是没有代价。Mint 在同样的清理里还删了 npm 自己的下载缓存,所以重装要重新从源上拉包,我们量到的那一次是 74 MB。我们手上唯一一份渲染日志显示,又重新下载了 94 MB 的无界面 Chrome。

最后一次删除,发生在我们提交修复的 28 分钟之后。那台 Mac 上装的 Mint 还没有这个修复。

模型

同样的清理还删掉了 Hugging Face 缓存,Python 工具下载的模型就放在这里。我们这里放的是视频流程做配音和字幕用的三个模型:VoxCPM2(约 5 GB)、SenseVoiceSmall(0.9 GB)和 wav2vec2-base-960h(0.4 GB)。

9 月 29 日到 10 月 1 日,Mint 删了整个文件夹 6 次,又单独删了这三个模型的文件夹 1 次,一共 35.4 GB。到 10 月 3 日,其中 34.3 GB 又回来了。下载器自己的日志记下了其中 12.6 GB,下载用了约 17 分钟;其余是根据下一次删除前文件夹的大小推出来的。Mint 的记录还显示,从 8 月 16 日起,这个文件夹另外被删过 10 次。

模型不是通常意义上的缓存。要拿回来就得下载好几个 GB,而且需要它的工具下次运行时会自己去下,不会问你。

“在用”到底指什么

查有没有程序开着这些文件是没用的:npm 和视频工具只开几秒钟就关上。两次渲染之间没有任何程序占着它们,清理恰恰就发生在这些时候。

管用的信号都在磁盘上:

  • 什么时候装的。 npm 每次安装都会写 node_modules/.package-lock.json。
  • 项目最后一次运行或修改是什么时候。 视频工具每次渲染都会往 node_modules 里写缓存(.remotion、.cache),改项目也会写项目自己的文件。
  • 它有没有回来过。 第一次删除之后,这个文件夹自己的历史就已经写着:删掉了,11 分钟后又建了出来。

检查你自己的项目

下面这条命令列出某个文件夹下每个 node_modules 的大小,以及 npm 最后一次安装它的日期。它只读。把 ~/Projects 换成你放代码的地方:

find ~/Projects -maxdepth 4 -type d -name node_modules -prune |
while read -r d; do
  f="$d/.package-lock.json"
  [ -f "$f" ] && t=$(stat -f %Sm -t %Y-%m-%d "$f") || t="unknown   "
  printf "%6s  installed %s  %s\n" "$(du -sh "$d" | cut -f1)" "$t" "${d%/node_modules}"
done

这周刚装的,属于正在用的项目,删了只会换来一次重装。几个月前装的、项目也早就不碰了,这种才值得删。显示 “unknown” 说明 npm 没写这个文件(Yarn 和 pnpm 用自己的文件),那就看项目最后一次提交是什么时候。删之前要检查锁文件,这篇删除旧 node_modules 的指南里写了。

Mint 现在怎么做

  • 模型 在 Safe to clean 里有自己的 chip,每个模型一行,标着最后使用的日期。它们不会替你勾选,Auto Care 也从不处理;某个程序开着的模型,或者 LM Studio、Ollama 正在运行时,不会列出来。这部分随 Mint 1.0.82 在 10 月 2 日发布。
  • node_modules:最近 7 天用过的项目,会放进 Keep 并标上日期。“用过”指安装、运行、修改,或者有程序在项目里工作。删掉后又回来的文件夹会列出来,但永远不会替你勾选,Recommended 和 Auto Care 都会跳过它。点下去的那一刻还会再查一次。这部分随 Mint 1.0.91 在 10 月 9 日发布。

常见问题

node_modules 能删吗? 项目有锁文件、所有包都还能下载,就什么都不会丢。但如果你很快还要用这个项目,空间只回来几分钟,代价是一次重装。

那为什么不干脆跳过所有 node_modules? 几个月没人碰的项目里的 node_modules 加起来不少。在这台 Mac 上,值得删的正是它们,而且很容易跟正在用的区分开。

别的缓存也这样吗? 任何会被工具自己重新填满的东西都一样。删掉这个 node_modules 的 11 次清理里,有完整记录的 9 次都同时清空了 npm 的下载缓存,下一次安装又把它下载了回来。