vscode打开大型项目卡顿主因是默认配置监听和索引过度,需正确配置files.watcherexclude(如"/dist/":true)、search.exclude(如"**/node_modules":true)、禁用auto rename tag等高开销扩展,并在工作区级settings.json中设置才生效。

VSCode 打开大型项目卡顿,不是硬件不行,而是默认配置在扫描和监听上“太尽责”——关掉几个自动全量扫描的开关,加载速度能翻倍。
files.watcherExclude 配置不生效?检查 glob 写法和路径层级
很多用户加了 files.watcherExclude 却发现 CPU 还是狂转,根本原因是 glob 模式没写对或排除目录没覆盖全。
-
files.watcherExclude的 key 必须以**/开头,比如"**/dist/**"有效,"dist/**"无效 - Webpack 项目常见遗漏:除了
dist和build,还要加"**/.next/**"(Next.js)、"**/target/**"(Rust/Scala)、"**/out/**"(TypeScriptoutDir) - Monorepo 场景下,
"**/packages/**/node_modules/**"必须显式添加,否则子包的node_modules仍被监听 - Linux/macOS 用户若看到
ENOSPC或watcher limit reached错误,说明系统 inotify 句柄耗尽,需临时调大:echo 'fs.inotify.max_user_watches=524288' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
tsconfig.json 里 include/exclude 比 .vscode/settings.json 更关键
VSCode 的 TypeScript 语言服务优先读取 tsconfig.json 的 include 和 exclude,而不是编辑器设置。设错会导致 TSServer 白忙活。
- 必须显式声明源码范围:
"include": ["src/**/*", "types/**/*"],避免默认递归扫描整个工作区 -
"exclude"至少包含:["node_modules", "dist", "build", "test", "scripts"],注意这里不支持**/前缀 - 启用增量编译:
"incremental": true+"composite": true,让 TS 缓存 AST,后续启动跳过重分析 - 开发阶段可接受:
"skipLibCheck": true,省去对node_modules中.d.ts的类型校验,提速明显
typescript.tsserver.maxTsServerMemory 设高反而更稳?看内存余量
默认 3072 MB 对 16GB+ 内存机器偏保守;设太低会频繁 OOM 崩溃,设太高又可能挤占其他进程——得看实际负载。
- 若项目含 >5k 个 TS 文件,且你机器有 ≥16GB 内存,建议设为
4096(单位 MB),TSServer 崩溃率可降 92% - 该值写在
.vscode/settings.json里:"typescript.tsserver.maxTsServerMemory": 4096 - 别跟
node --max-old-space-size混淆——这是 VSCode 内部传给 TS Server 的 Node 启动参数,不是全局 Node 配置 - 配合
"typescript.tsserver.log": "off"关闭日志,减少磁盘 I/O 压力
扩展不是越多越好,尤其要盯住“自动激活型”插件
一个插件就能让 files.watcherExclude 失效——因为它自己调用了 fs.watch,绕过了 VSCode 的统一管控。
- 重点排查名称含
file、watch、scan、index的插件,比如 Auto Rename Tag、Path Intellisense、某些旧版 ESLint 配置 - 用命令
Developer: Show Running Extensions查内存/CPU 占用,禁用后观察是否改善 - GitLens 在超大单体仓库中慎用;如必须用,设
"gitlens.advanced.fileWatcher.latency": 1000降低监听频率 - 按需激活优于全局禁用:比如 Prettier 只在保存时触发,影响小;而 Volar(Vue)若项目不含
.vue文件,就该完全关掉
最易被忽略的一点:所有这些配置都依赖工作区级 .vscode/settings.json 生效。用户级设置会被覆盖,多根工作区里每个子文件夹还得单独配——漏掉任意一层,优化就白做了。











