files.watcherExclude配置不全会导致CPU持续20%~80%高占用,必须在项目根目录.vscode/settings.json中严格配置"/node_modules/": true等递归规则,并关闭重开工作区生效。

files.watcherExclude 配不全,CPU 就一直飙高
VSCode 的文件监视器(chokidar)一旦盯上 node_modules、dist、.git 这类目录,就会为每个小文件变更触发事件,主线程持续忙于处理,打字、保存、Git 状态刷新全变慢。这不是“偶尔卡”,而是持续性的 CPU 20%~80% 占用。
必须在项目根目录的 .vscode/settings.json 中配置,用户级设置对大型项目基本无效:
-
"**/node_modules/**": true—— 结尾/**不可省略,否则只排除文件夹本身,不递归子目录 -
"**/dist/**": true、"**/build/**": true、"**/.git/**": true - Python 项目加:
"**/venv/**": true、"**/__pycache__/**": true、"**/.mypy_cache/**": true - Java/Rust 项目加:
"**/target/**": true、"**/.jdt/**": true
改完后必须关闭整个工作区再重新打开,或执行 workbench.action.reloadWindow,仅关闭再打开标签页不生效。
search.exclude 和 files.watcherExclude 必须配齐
很多人只配了 search.exclude,结果搜索还是卡——因为 search.exclude 只跳过搜索时的内容读取,不阻止文件系统监听;而 files.watcherExclude 才是从源头掐断 I/O 风暴。
二者缺一不可,且路径写法有差异:
-
files.watcherExclude必须用"**/node_modules/**"(结尾/**强制递归) -
search.exclude用"**/node_modules/**"或"**/node_modules"都行,但建议统一写法避免混淆 - 常见漏项:
"**/*.log"(单个 500MB 日志就能阻塞整个 watcher 队列)、"**/.next/**"、"**/out/**"
如果项目用了 .gitignore,建议把里面所有非空行路径转成 files.watcherExclude 条目——不是为了省事,是防止 Git 插件和搜索插件各自重复扫描同一堆垃圾。
Pylance / TS Server 默认扫全盘,得手动“瘦身”
Python 或 TypeScript 项目卡顿,常被误认为是语言服务慢,实际是 Pylance 或 tsserver 在默认模式下扫描整个工作区,包括 venv 或 node_modules 里的数万份第三方类型定义。
关键控制点:
- 显式指定 Python 解释器路径:
"python.defaultInterpreterPath": "./venv/bin/python"(Linux/macOS)或"./venv/Scripts/python.exe"(Windows) - 限制分析范围:
"python.analysis.diagnosticMode": "workspace"(只检查当前工作区) - TypeScript 项目:在
tsconfig.json中明确写死"include",比如["src/**/*"],并关掉"typescript.preferences.autoImportFileExtensions": "never" - 禁用自动导入提示:
"python.suggest.autoImports": false,避免大项目中反复解析包路径
这些设置不写进项目级 .vscode/settings.json,就等于没设——全局设置无法约束语言服务器的实际扫描行为。
GitLens 等插件会绕过所有排除规则
即使你把 files.watcherExclude 和 search.exclude 配得再全,GitLens、GitHub Pull Requests 这类插件仍可能主动读取 venv 或未提交的二进制文件,导致 CPU 再次拉满。
应对方式很直接:
- 右键点击扩展 → “在工作区中禁用”,而不是全局禁用,保留其他小项目可用
- GitLens 关键降载项:
"gitlens.lineAnnotations.enabled": false、"gitlens.statusBar.enabled": false - 不用 mypy 就删掉
.mypy_cache目录,并确保它也在files.exclude里 - monorepo 或 link 项目务必设
"search.followSymlinks": false,否则符号链接会把外部node_modules全拖进来
最硬核但最有效的验证方式:按 Ctrl+Shift+P → 输入 Developer: Open Process Explorer,盯着 Extension Host 进程的内存与 CPU 排序,前 3 名就是真凶。临时禁用后用 code --disable-extensions 命令行重启,对比是否恢复流畅——这是唯一不靠猜的判断依据。











