必须用"/node_modules/": true才能真正递归排除子树,因VSCode的search.exclude需/开头+/结尾才匹配任意层级并跳过全部后代;同时必须同步配置files.watcherExclude且值为true,否则监听器仍会卡CPU;改完需重载窗口或删除.vscode/.search强制刷新索引。

search.exclude 必须用 **/ 开头 + /** 结尾才能真正跳过子树
VSCode 默认会递归扫描所有子目录,遇到 node_modules 这类含数万文件的目录时,主线程直接卡死,“正在搜索…”就一直转。光写 "node_modules": true 或 "node_modules/**": true 都不行——前者只匹配工作区根下的同名文件夹,后者语法不被识别。
真正生效的写法必须同时满足:
-
"**/node_modules/**": true:开头**/匹配任意层级嵌套,结尾/**表示跳过整个子树(包括node_modules/.bin/esbuild这种深层可执行文件) - 多个规则用英文逗号分隔、不换行:JSON 对格式敏感,换行或注释会让整段配置失效
- 路径必须用正斜杠
/,Windows 用户写\node_modules\**或node_modules\**全部无效
files.watcherExclude 不配等于白配
很多人配完 search.exclude 发现还是卡,是因为文件监视器(file watcher)仍在后台反复扫描那些大目录。它不参与搜索本身,但会持续 stat 和监听变更,CPU 占用高,间接拖慢搜索准备阶段。
必须同步配置 files.watcherExclude,且路径和 search.exclude 完全一致:
"files.watcherExclude": { "**/node_modules/**": true, "**/dist/**": true }- 注意:
files.watcherExclude的值必须是布尔值true,写成字符串"true"无效 - 它不支持
**/*.log这类文件级排除,只认目录路径
想只搜 src 和 include?用 search.include 白名单更可靠
界面底部手动填 src/** 或 **/src/** 是临时行为,关掉面板就清空;而且它不带上下文,src/** 会被当作相对路径处理,容易漏扫或误扫。
稳定做法是直接在项目根目录的 .vscode/settings.json 里配 search.include:
-
"${workspaceFolder}/src/**": true:显式锚定到工作区根,支持跨层级递归 -
"${workspaceFolder}/include/**": true:多个源码目录就都列出来,别指望**/src/**能覆盖lib/src -
search.include是白名单机制,没列进去的路径一律跳过,优先级高于界面输入框 - 如果同时用了
search.exclude,比如排除"${workspaceFolder}/src/generated/**": true,那即使在 include 列表里也会被跳过
改完配置不生效?索引缓存没清
VSCode 搜索依赖本地倒排索引,修改 search.exclude 后不会自动重建。旧索引可能继续返回已被排除目录里的结果,甚至“搜不到”刚加进 include 的新文件。
强制刷新方式只有两个有效:
- 按
Ctrl+Shift+P→ 输入Developer: Reload Window,选中并执行(不是简单关闭再重开) - 手动删掉项目根目录下的
.vscode/.search文件夹,让 VSCode 下次启动时重建索引
这个步骤常被跳过,但它是配置能否真正起效的关键一环——尤其在 monorepo 或大型 C++ 项目里,索引残留问题特别明显。











