search.exclude必须用/前缀的glob模式,如"/node_modules/";面板“files to exclude”优先级更高;修改后需重载窗口或删.vscode/.search才能生效;files.exclude仅隐藏文件,search.exclude才禁搜索。

search.exclude 配置必须用 glob 模式,且带 **/ 前缀
直接写 node_modules 或 dist/ 是无效的。VSCode 的 search.exclude 只认 glob 语法,且必须用 **/ 表示“任意深度的前缀”,否则只匹配项目根目录下的同名目录。
常见错误写法:
-
"node_modules": true→ 不合法,VSCode 忽略整条规则 -
"dist/": true→ 末尾斜杠多余,可能匹配失败 -
"./dist": true→ 带点斜杠是相对路径写法,不被支持
正确写法(放进 .vscode/settings.json):
{ "search.exclude": { "**/node_modules/**": true, "**/dist/**": true, "**/build/**": true } }
注意:**/node_modules/** 中第二个 ** 表示该目录下所有内容,避免嵌套在 packages/foo/node_modules 里仍被扫描。
面板里的 “files to exclude” 优先级高于 search.exclude
按 Ctrl+Shift+H 打开替换面板后,右上角有个“排除文件”输入框(label 是 files to exclude)。这里填的内容会覆盖 search.exclude 设置,哪怕你已经在 settings.json 里配好了。
所以即使配置了 search.exclude,仍搜出 lib/ 里的内容,大概率是这里被手动清空或填了冲突规则。
建议做法:
- 临时排除:直接在面板里填
lib, dist, **/*.log(逗号分隔,不加引号) - 永久排除:确保面板右上角小齿轮 → “Use Exclude Settings and Ignore Files” 是勾选状态
- 检查是否误输
!**/dist—— 感叹号会反转逻辑,变成“只搜 dist”
改完 settings.json 后搜索仍不生效?索引没重建
VSCode 搜索依赖本地缓存索引,修改 search.exclude 后不会自动刷新。尤其在大型项目中,旧索引还在内存里跑,导致新规则看似“没用”。
必须做以下之一才能让改动落地:
- 执行
workbench.action.reloadWindow(Ctrl+Shift+P输入后回车) - 手动删掉项目根目录下的
.vscode/.search文件夹(如果存在) - 确认工作区已正确加载:左下角状态栏显示的是文件夹名,不是“未打开文件夹”或单个文件名
另外,search.exclude 必须写在 .vscode/settings.json(工作区)或用户设置 JSON 中;写在 tsconfig.json 或 package.json 里完全无效。
别把 files.exclude 和 search.exclude 搞混
files.exclude 控制左侧资源管理器是否显示某目录;search.exclude 才真正决定全局搜索(Ctrl+Shift+F 或 Ctrl+Shift+H)是否扫描它。很多人配了前者就以为搜索也跳过了,结果一搜全是 dist/ 里的旧代码。
两者规则写法一致,但作用完全不同:
- 想让
node_modules在侧边栏消失 → 配files.exclude - 想让它不参与任何文本搜索 → 必须配
search.exclude - 两者都配,才做到“看不见、也搜不到”
最常被忽略的一点:VSCode 默认不读取 .gitignore 来控制搜索,除非你显式开启 "search.useIgnoreFiles": true —— 这个开关不开,.gitignore 里写的 /venv 对搜索毫无影响。











