必须用"**/node_modules": true等带glob前缀的格式写入search.exclude才生效;裸写"node_modules": true无效,因vscode只匹配字面路径且不识别无前缀规则。

全局搜索排除规则不生效,基本就是 search.exclude 没配对位置、没写对格式,或者被临时设置覆盖了。
为什么写了 node_modules 还是搜得到?
VSCode 的 search.exclude 不认裸路径,"node_modules": true 完全无效——它只匹配字面量路径,而真实路径是 src/node_modules 或 packages/core/node_modules,必须带前缀才能命中。
-
"**/node_modules": true✅ 覆盖所有嵌套层级,最常用 -
"/node_modules": true✅ 仅根目录,适合单包项目 -
"node_modules": true❌ 不匹配任何子目录下的同名文件夹 -
"node_modules/**": true❌ 缺少开头**/,VSCode 直接忽略整条规则 -
"**\node_modules": true❌ Windows 反斜杠不被 glob 解析器识别
怎么写 search.exclude 才真正生效?
必须写进 .vscode/settings.json(工作区级)或用户级 settings.json,且结构必须是对象,每个规则独立成 key。
- 路径用 glob 模式,
**/表示任意深度子目录,*匹配当前层文件名 - 排除所有日志:
"**/*.log": true(*.log只作用于根目录,不够用) - 排除构建产物:
"**/dist/**": true或"**/build/**": true,结尾/**更稳妥,避免漏掉深层嵌套的同名目录 - 别把多个模式塞进一个字符串:
"**/*.log,**/*.tmp": true❌ 这会被当做一个路径,无效 - 正确结构只能是:
"**/*.log": true,"**/*.tmp": true,"**/.git/**": true
临时排除比永久配置优先级更高
搜索面板右下角点 ⋯ → «Files to exclude» 输入框填的内容,会直接覆盖 search.exclude 里的同名规则,且不保存、不跨会话。
- 输入
**/test/**, **/legacy/**,这次搜索立刻跳过,关掉面板就失效 - 多个规则用英文逗号分隔,不能有空格:
**/dist,**/node_modules - 如果这里非空,VSCode 就完全忽略
search.exclude,哪怕你刚改完设置也不会生效 - 适合调试时快速验证:比如想确认某段逻辑是否只存在于
legacy目录,临时加一条再搜
容易被忽略的性能与协作细节
写错一条规则可能让搜索变慢,甚至漏结果。VSCode 的 glob 匹配是字符串扫描,不是正则引擎,宽泛模式开销很大。
- 避免嵌套太多
**:"**/a/**/b/**/c.js"这类写法会让匹配时间指数增长 - 别用
"**/.*"排除所有隐藏文件——大项目里每个文件都得做一次字符串检查,卡顿明显 - 多根工作区中,每个子文件夹的
.vscode/settings.json是独立生效的,不能靠根目录一条规则覆盖全部 - 团队协作时,把
search.exclude写进项目级.vscode/settings.json并提交 Git,比依赖个人设置更可靠











