先运行code --status定位高占用进程,再配置files.watcherexclude排除node_modules等目录、降级语言服务(如python改用jedi)、禁用高开销插件并彻底重启窗口。

直接看 code --status,别猜、别 reload、别重装——90% 的后台服务高占用,靠它三秒定位真凶。
怎么看哪个后台服务在疯跑
VSCode 后台服务(比如 tsserver、pyright、eslint-server、Extension Host)不是抽象概念,而是真实进程。卡顿不是“感觉慢”,是某个子进程 CPU 持续 >60% 或内存暴涨。
- 终端执行
code --status,立刻看到所有子进程的PID、CPU%、内存占用 - 重点关注
Extension Host行:CPU% 高 ≠ 它本身坏,而是它加载的某个扩展在死循环或反复重载 - 单独看到
tsserver或pyright占高?说明语言服务正在全量解析node_modules/@types或整个依赖树,不是项目小,是默认策略太重 - 记下高占用进程的
PID,再用ps -p [PID] -o args=(macOS/Linux)或任务管理器“详细信息”页查命令行,确认是不是node /path/to/pylance这类路径——这才是要调的靶子
为什么禁用扩展后 CPU 还不降
VSCode 的扩展激活机制很实在:onStartup 类扩展(如 gitlens.gitlens、esbenp.prettier-vscode、ms-python.python)一启动就拉起独立 Node.js 子进程,建索引、监听文件、预热服务。禁用操作只是阻止下次加载,旧进程不会自动退出。
- 右键禁用后,必须彻底关闭当前 VSCode 窗口(包括菜单栏图标),再重新打开项目
-
Developer: Reload Window不够——子进程仍在后台跑,ps aux | grep -i "pyright\|tsserver"能验证是否残留 - 检查
settings.json里是否还留着"eslint.enable": true或"prettier.requireConfig": false这类配置,它们会强制 VSCode 尝试加载插件,哪怕扩展已禁用
files.watcherExclude 配错等于没配
VSCode 底层用 chokidar(Linux/macOS)或 fsevents(macOS)监听文件变更。一旦 node_modules(几万小文件)、.git/objects、dist 被扫,内核 inotify 事件就爆炸式触发,Node.js 子进程持续 100% 跑——你什么都没干,CPU 就飙了。
- 必须加在项目根目录的
.vscode/settings.json中,不是用户级settings.json - 通配符必须是
"**/node_modules/**": true,写成"node_modules"、"*/node_modules/*"、"node_modules/**"全无效 - 推荐完整配置:
"**/node_modules/**"、"**/.git/**"、"**/dist/**"、"**/build/**"、"**/__pycache__/**"、"**/venv/**" - 改完必须关闭并重新打开该工作区,仅保存文件不触发更新
- Linux 用户额外检查:
cat /proc/sys/fs/inotify/max_user_watches,若低于524288,需调高
语言服务器降级比禁用更有效
Python 和 TypeScript 的语言服务不是“卡”,是默认设计为深度语义分析。中大型项目下,Pylance 或 TSServer 内存驻留轻松破 1.2GB,CPU 持续拉高是必然结果,不是 bug。
- Python 项目:把
python.languageServer从Pylance改为Jedi(Jedi 不加载全部依赖,只做基础补全),重启后执行Python: Restart Language Server - TypeScript 项目:加配置
"typescript.preferences.includePackageJsonAutoImports": "auto",避免 npm 包导入时反复解析全部@types - ESLint 类插件:把
"eslint.run"改成"onSave",禁掉onType实时检查,敲字不卡,保存再报错 - 顺手关掉
editor.quickSuggest和editor.suggest.preview,AI 补全和实时提示叠加时,内存峰值极易冲顶
真正卡住人的,往往不是单个配置漏了,而是 files.watcherExclude 没生效 + 语言服务没降级 + 扩展禁用没重启窗口——三者叠加,优化就失效。动手前先 code --status 看一眼,比盲目调参快十倍。











