必须用"**/node_modules": true等glob格式配置search.exclude,files.exclude仅影响侧边栏;临时排除在搜索面板"files to exclude"中设置,会覆盖search.exclude;修改后需重载窗口生效。

search.exclude 配置必须用 glob 模式,且路径要带 **/ 前缀
直接写 "node_modules": true 或 "*.log": true 是无效的。VSCode 的 search.exclude 只认 glob 语法,而且要求路径能匹配任意层级 —— 根目录下的 node_modules 和 packages/foo/node_modules 都得跳过,就必须用 "**/node_modules": true。
常见写法对比:
-
"node_modules": true→ 只匹配根目录下名为 node_modules 的项,不递归,不生效 -
"*.log": true→ 只匹配根目录下 .log 文件,src/utils/app.log仍会被搜到 -
"**/*.log": true→ 正确,递归匹配所有 .log 文件 -
"**/dist/**": true→ 正确,跳过所有 dist 目录及其全部内容(含子文件)
注意:值必须是布尔型 true,不是字符串 "true";路径中不能用反斜杠 \,Windows 下也要写 /。
files to exclude 输入框优先级高于 search.exclude
在搜索面板右上角点开「files to exclude」输入框填的规则,会覆盖 search.exclude 里的配置。比如你在 settings.json 里写了 "**/dist": true,但搜索时又在输入框里手动加了 dist,那这次搜索就只按 dist 执行 —— 而 dist 不带 **/,只排除根目录下的 dist,子目录里的照样被扫。
这个输入框适合临时调试,比如想确认某段逻辑是否只出现在 legacy/ 目录里,就填 **/src/test/**, **/node_modules/**,关掉面板就自动清空。
要点:
- 多个规则用英文逗号分隔:
node_modules, **/build/, *.tmp - 路径始终相对于工作区根目录,不是当前打开的文件位置
- 它只影响本次搜索,不会写入任何配置文件
改了 search.exclude 为什么还是搜出 dist/?索引没重建
VSCode 搜索依赖本地缓存索引,修改 search.exclude 后不会自动刷新。尤其在大型项目中,旧索引还在内存里跑,你看到的结果其实是“历史快照”。
必须做以下之一才能让新规则生效:
- 执行
workbench.action.reloadWindow(快捷键Ctrl+Shift+P→ 输入该命令)强制重载窗口 - 手动删除项目下的
.vscode/.search文件夹(如果存在),下次搜索时重建索引 - 删掉搜索框里的关键词、重新输入一次,有时也能触发局部更新(但不可靠)
别指望保存 settings.json 就立刻见效 —— 这个步骤常被跳过,也是最常被问“为什么不起作用”的原因。
search.exclude 和 files.exclude 完全是两回事
很多人以为配了 files.exclude 就等于搜索也跳过了,结果一搜全是 dist/ 里的旧代码。其实:
-
search.exclude:只控制Ctrl+Shift+F全局搜索扫描哪些文件,不影响侧边栏显示 -
files.exclude:只控制左侧资源管理器是否显示文件,以及部分语言服务(如 TS 的路径提示),完全不影响搜索
想让搜索变快、结果干净 → 必须配 search.exclude;想让侧边栏清爽 → 配 files.exclude。两者可以共存,但不能互相替代。
还有一点容易被忽略:如果你打开的是单个文件夹(而非加载了 .vscode/settings.json 的工作区),那工作区级的 search.exclude 根本不会加载 —— 此时只有用户级设置起作用。











