真正起作用的是search.exclude,files.exclude仅控制侧边栏显示;必须用"/node_modules": true等glob格式配置,路径需带/前缀才递归匹配所有嵌套层级,值为布尔true,修改后需重载窗口生效。

search.exclude 才管全局搜索,files.exclude 完全不相关
改了 files.exclude 却发现 Ctrl+Shift+F 还是搜出一堆 node_modules 里的文件?不是配置没生效,是压根用错了地方。files.exclude 只控制左侧资源管理器是否显示文件夹,对搜索行为零影响。真正起作用的只有 search.exclude,它专为全局搜索设计,且只在搜索时生效。
search.exclude 的路径必须带 **/ 前缀才递归生效
"node_modules": true 看起来简洁,但 VSCode 不认——它只做字面路径匹配,而真实路径通常是 src/lib/node_modules 或 packages/core/node_modules,没前缀就完全不触发。
- ✅ 推荐:
"**/node_modules": true(覆盖所有嵌套层级,包括 monorepo 子包) - ✅ 可选:
"node_modules": true(仅根目录,适合单层结构) - ❌ 无效:
"node_modules/**": true、"node_modules": true、"**\node_modules": true(Windows 反斜杠也不行)
注意:**/ 是 glob 必需语法,不是可有可无的装饰;值必须是布尔型 true,不能写成字符串 "true"。
临时排除比永久配置更灵活,但优先级更高
打开搜索面板(Ctrl+Shift+F),点右下角 ⋯ → «Files to exclude»,直接填 **/node_modules,逗号分隔多个规则,比如 **/node_modules,**/dist,**/*.log。这个输入框的规则会覆盖 search.exclude 配置,且只对本次搜索生效。
- 多个规则用英文逗号分隔,不能用空格或中文逗号
- 路径始终相对于工作区根目录,不是当前打开的文件位置
- 如果勾选了右上角的 «Files to include» 输入框(图标是 ?),它会彻底覆盖
search.exclude,导致排除失效
多根工作区下,每个子文件夹要单独配
如果你开的是多根工作区(比如同时打开 packages/app 和 packages/utils),search.exclude 是按文件夹分别生效的。根目录下的配置不会自动继承到子文件夹。
- 每个子项目根目录下必须有自己独立的
.vscode/settings.json -
.code-workspace文件本身不支持直接写search.exclude - 修改后需执行
Developer: Reload Window才能生效,否则可能缓存旧状态
别指望一条配置打遍全项目——尤其在 yarn workspaces 或 pnpm workspace 场景下,子包里的 node_modules 只有各自 .vscode/settings.json 里写了 "**/node_modules": true 才真被跳过。











