Cursor 一直 indexing 怎么办:让它跳过 node_modules 与构建产物

Cursor 卡在 indexing 不动?多半是 node_modules、build / dist、缓存目录被索引了。这篇给出 .cursorignore 模板与重建索引的步骤。

打开一个稍微大点的项目,Cursor 状态栏永远停在 Indexing 5%,半小时也不动;或者 indexing 跑完了又自动重跑,整台 Mac 风扇拉满。90% 的情况不是 Cursor 卡死,而是它正在试图索引 node_modules/dist/.git/ 这些根本不该索引的目录——一个中型前端项目里这几个目录加起来轻松破百万文件,普通 SSD 也撑不住。这篇给出最快让 Cursor 跳过它们的 .cursorignore 模板、强制重建索引的步骤,以及如何确认索引真的健康了。

常见原因

按出现频率从高到低排序。

1. node_modules/ 没被排除

最常见。一个中型前端项目的 node_modules/ 通常 300k–800k 个文件,比你的源代码多两个数量级。Cursor 默认应该跳过,但偶尔会因为 workspace 配置异常或符号链接而把它算进来。

如何判断find node_modules -type f | wc -l,若 > 100000 且 Cursor 状态栏长时间在 Indexing,几乎肯定是它。

2. 构建产物目录(dist/ / build/ / .next/ / .astro/

热重载频繁的项目,构建产物每次都被刷新,Cursor 检测到文件变更就重新索引,进入”索引完→检测到变化→重索引”的死循环。

如何判断:开发服务器跑着的时候 Cursor 反复出现 Indexing,停掉 dev server 就稳定下来。

3. .git/ 对象目录

大仓库的 .git/objects/ 能有几十万个 pack 文件。Cursor 通常自动跳过,但克隆自镜像或带 LFS 的仓库偶尔会漏。

如何判断du -sh .git/,若 > 500MB 且没显式 ignore,怀疑它。

4. 缓存与日志目录

.cache/.turbo/.vercel/logs/coverage/ 频繁写入,触发同样的死循环问题。

如何判断:Cursor 重新索引时,看 Activity Monitor 里它的磁盘读写排序,落在哪个目录上。

5. Monorepo 多子包产物全部命中

apps/web/.nextapps/api/distpackages/ui/storybook-static 一起索引,几百万文件叠加。每个子包都得有自己的 .cursorignore,或者根目录写通配规则。

如何判断find . -name dist -o -name .next -o -name build -type d,若返回 > 3 条且无 ignore 覆盖,就是。

最短修复路径

Step 1:写一份”通杀”的 .cursorignore

在项目根创建或编辑 .cursorignore

# 依赖
node_modules/

# 版本控制
.git/

# 构建产物
dist/
build/
out/
.next/
.astro/
.svelte-kit/
.nuxt/
.output/

# 缓存
.cache/
.turbo/
.vercel/
.parcel-cache/
.pytest_cache/
__pycache__/

# 测试覆盖率
coverage/
.nyc_output/

# 日志与产物
*.log
*.lock

Monorepo 在每个子包里再放一份”局部” .cursorignore

# packages/web/.cursorignore
.next/
.turbo/

Step 2:彻底重建索引

.cursorignore 修改不会自动重建——必须手动触发。

Cmd/Ctrl + Shift + P → "Cursor: Reset Index"

或更彻底(推荐用于死循环场景):

# 关掉 Cursor 后清缓存
rm -rf ~/Library/Application\ Support/Cursor/User/workspaceStorage/*/cursorIndex
# Linux:
rm -rf ~/.config/Cursor/User/workspaceStorage/*/cursorIndex
# 重新打开 Cursor

Step 3:等待并确认状态

重启 Cursor,重新打开项目:

  1. 状态栏先短暂显示 Indexing 0%
  2. 1–3 分钟内跳到 Indexed(中型项目);大型 monorepo 5–10 分钟
  3. 若 10 分钟后仍未完成,回到 Step 1 检查是否漏了某个产物目录

打开 Settings → Features → Codebase Indexing 看 “Files Indexed” 数。健康的中型项目通常在 5k–30k;如果还在 100k+,ignore 还没生效。

Step 4:dev server 也对应做隔离

如果索引完了又被 dev server 触发重跑,把 dev 输出目录也加进 .cursorignore。Vite / Webpack 可以把 build output 放进单独的、已被 ignore 的目录:

// vite.config.ts
export default {
  build: {
    outDir: 'dist',  // 已在 .cursorignore
  },
  cacheDir: '.cache/vite',  // 已在 .cursorignore
}

预防建议

  • 创建新仓库时第一件事就 commit .cursorignore,模板和 .gitignore 同步维护
  • 不要把缓存 / 构建产物目录放进项目根之外的奇怪位置;统一在根
  • monorepo 在每个子包都加 .cursorignore,不要指望根目录的通配能覆盖所有变体
  • 装新依赖、改 build 工具或加新生成器后,主动 Reset Index 一次,别等死循环
  • dev server / hot reload 频繁写入的目录(.cache/.turbo/),永远 ignore

相关阅读

标签: #Cursor #AI 编程 #排查