ctrl+shift+f 搜索包含 node_modules 是因未配置排除规则;需通过 search.exclude 设置全局排除或搜索面板手动输入 !node_modules/**,并注意 glob 语法、工作区层级与路径相对性。

为什么 Ctrl+Shift+F 搜索总跑出 node_modules?
默认全局搜索会遍历整个工作区,包括 node_modules、.git、dist 这类目录,结果刷屏且响应慢。这不是 VSCode 故意拖慢你,而是它没被告知“哪些该跳过”。
- VSCode 的搜索作用域由
search.exclude(用户级)和搜索面板右上角的“排除文件夹”字段(会话级)共同控制 -
search.exclude写在settings.json里,对所有搜索生效;面板里手动填的!node_modules/**只影响当前搜索,不保存 - 通配符必须用双星号
**表示递归,单星号*只匹配当前层,!node_modules不会排除子目录里的node_modules/@types
如何用快捷键快速切换常用搜索范围?
VSCode 本身不提供“切换搜索作用域”的内置命令,但你可以把不同范围的搜索逻辑封装成自定义命令 + 快捷键,实现一键切换。
- 打开
keybindings.json(Cmd+Shift+P →Preferences: Open Keyboard Shortcuts (JSON)) - 添加两条绑定,分别对应“仅 src”和“排除构建产物”:
[
{
"key": "cmd+alt+s",
"command": "workbench.action.findInFiles",
"args": {
"query": "",
"filesToInclude": "src/**/*",
"filesToExclude": "!node_modules/**,!dist/**,!build/**"
},
"when": "editorTextFocus"
},
{
"key": "cmd+alt+x",
"command": "workbench.action.findInFiles",
"args": {
"query": "",
"filesToExclude": "!node_modules/**,!dist/**,!build/**,!out/**"
},
"when": "editorTextFocus"
}
]
-
filesToInclude和filesToExclude支持 glob,但注意:两者不能同时为空,否则行为未定义 - 命令触发后仍需手动输入关键词——它只预设范围,不自动执行搜索
- Mac 用户慎用
cmd+alt+s:系统截图快捷键可能拦截,可改用cmd+ctrl+s
搜索面板里填的 !node_modules/** 为啥有时不生效?
常见原因是路径匹配规则被覆盖或解析失败,尤其当工作区根目录不是 Git 仓库根时。
- 检查是否在多根工作区(workspace file)中打开项目:每个根目录有自己的
settings.json,search.exclude需写在对应根目录的设置里 - 排除路径必须相对于工作区根目录,不是当前文件所在目录。比如工作区根是
/project,而你在/project/client/src编辑文件,!src/**会失效,得写!client/src/** - 如果用了符号链接(symlink),VSCode 默认不跟随,
search.followSymlinks需设为true才能正确识别链接目标下的排除规则
想让某次搜索“只查 .ts 文件”,但不想改全局设置
最轻量的做法是在搜索面板第二行“包含的文件”里直接输入 *.ts 或 src/**/*.ts,回车即生效。
- 支持逗号分隔多个模式:
*.ts,*.tsx - 支持否定:
!**/test/**,*.ts表示“所有 .ts 文件,但排除 test 目录下的” - 注意空格:输入
*.ts , *.js中的空格会被当作路径一部分,导致匹配失败;应写成*.ts,*.js - 这个输入框内容不会被快捷键记住,每次都要重输——所以才需要上面那种
keybindings.json封装方案
真正麻烦的不是写对 glob,而是确认当前工作区结构和设置生效层级。多根、符号链接、远程开发(SSH/WSL)都会让路径解析变复杂,建议先在搜索面板里手动试出正确的 filesToExclude 值,再固化到快捷键里。











