files.watcherExclude 必须在 .vscode/settings.json 中配置为 "/node_modules/": true 等双星号通配格式才生效,仅设 search.exclude 或 files.exclude 不足以降低 CPU,还需配合 tsconfig.json 的 include/exclude、WSL 下禁用实验监听器等措施。

files.watcherExclude 怎么配才真正生效
VSCode 的文件监视器(file watcher)默认会递归监听整个工作区,一旦项目里有 node_modules 或 dist 这类目录,内核级 inotify/fsevents 事件就容易爆炸,CPU 直接干到 80%+。光在设置界面点几下“排除”没用——必须写进 .vscode/settings.json,且路径格式稍有偏差就完全不生效。
- 必须用双星号通配:
"**/node_modules/**": true,少一个/或漏掉末尾/**,可能只排除了第一层,子目录照常监听 - 排除项只对当前工作区起作用,不能写在用户全局设置里——否则你打开一个小脚本项目,也会意外失去对它
node_modules的依赖跳转 - 常见漏项:
"**/.git/objects/**"和"**/coverage/**",这两个目录 IO 密集度极高,尤其.git/objects在频繁提交时会持续触发事件 - 验证是否生效:打开命令面板,运行
Developer: Open Process Explorer,观察watcherService进程的 CPU 占比;再对比禁用前后lsof -p $(pgrep code) | grep inotify的句柄数变化
search.exclude 和 files.exclude 到底有什么区别
很多人以为设了 search.exclude 就等于“看不见也搜不到”,其实它只管搜索(Ctrl+Shift+F),不影响资源管理器显示、也不影响文件监视。而 files.exclude 是视觉 + 监听双重隐藏——但注意,它不会阻止语言服务器(比如 tsserver 或 pyright)去读取这些文件。
-
search.exclude:纯前端过滤,搜索结果里不出现匹配项,但后台仍可能扫描磁盘(尤其开启search.useIgnoreFiles时会读.gitignore) -
files.exclude:资源管理器里直接不显示,同时告诉 VSCode “别为这些路径创建文件监视器”,这才是降 CPU 的关键一环 - 必须两个都配,且内容高度重合,例如:
"**/node_modules/**"、"**/dist/**"、"**/build/**"、"**/coverage/**" - 别信 glob 模式里的“相对路径”——
"node_modules"不生效,"**/node_modules/**"才行;"./node_modules"反而会报错
为什么改了 settings.json 还是卡?检查这几个隐藏开关
即使正确配置了排除规则,CPU 依然居高不下,大概率是其他机制在“偷偷补刀”。特别是 TypeScript 和 Python 项目,语言服务本身就有独立的扫描逻辑,完全绕过 VSCode 的 files.watcherExclude。
- TypeScript 项目务必检查
tsconfig.json:如果没写"include",tsserver默认扫整个工作区,包括被files.exclude隐藏的目录 - Python 用户注意
python.languageServer设置:从Pylance切到Jedi能显著降低内存驻留,但代价是少了类型推导;若坚持用 Pylance,请确认python.defaultInterpreterPath指向的是项目虚拟环境,而非全局 Python - WSL 用户额外加一条:
"files.useExperimentalFileWatcher": false——新版实验监听器在某些 WSL2 内核上反而更耗资源 - GitLens 等扩展自带文件监听:哪怕你排除了
.git,它仍可能通过自己的 API 拉取 commit history,建议关闭gitlens.lineAnnotations.enabled或设gitlens.advanced.maxConcurrentRequests为1
超大单文件(>100MB)怎么避免卡死
VSCode 对单个文件的处理不是靠“排除”,而是靠“降级”。它默认启用语法高亮、tokenization、折叠等全套解析,遇到日志或数据 dump 文件,内存瞬间飙到几个 GB,UI 直接冻结。
- 先开内置优化:
Files: Enable Large File Optimizations(设置里搜关键词即可勾选),它会自动禁用高亮、折叠、大纲,仅保留基础编辑能力 - 手动调低阈值:
"files.maxMemoryForLargeFilesMB": 2048(默认 4096),配合"editor.maxTokenizationLineLength": 10000,防止某一行超长 JSON 把 token 化引擎拖垮 - 真·只读场景用命令行:
code --read-only /path/to/huge.log,状态栏右下角出现READONLY标识才算成功,此时连语言服务都不会启动 - 别装“大文件查看器”插件来凑数——像
Hex Editor是流式加载,但如果你只是想查一段文本,用code --read-only更轻量、更可靠
tsconfig.json 的 include 和 exclude 没配,以及 WSL 下的 files.useExperimentalFileWatcher 开关。这两处不调,前面所有 watcherExclude 配置都像给漏水的桶贴胶带。


















