VSCode 卡顿主因是 tsserver 默认全量扫描工作区,优化需收窄索引范围、关闭自动导入与日志、排除 node_modules 等目录监听,并重启窗口生效。

VSCode 本身不“加载 JS 代码”,真正拖慢响应的是 JavaScript 语言服务(tsserver)和相关插件对项目文件的索引、解析与监听行为。优化关键不是换插件,而是收窄作用范围、切断无效监听、关闭高开销特性。
为什么打开一个 .js 文件就卡顿?
根本原因不是文件大,而是 tsserver 默认扫描整个工作区——包括 node_modules、dist、.git,甚至你只是临时拖进来的压缩包。它一边解析类型定义,一边监听成千上万个文件变化,CPU 和内存直接拉满。
- 典型现象:光标输入延迟、
Go to Definition转圈、补全弹出慢或不弹、保存时编辑器短暂冻结 - 验证方式:命令面板运行
Developer: Show Running Extensions,看typescript-language-features或JavaScript and TypeScript Nightly的“启动耗时”是否超 300ms - 注意:
Prettier、ESLint、Auto Import这类插件在保存/输入时高频介入,会和tsserver抢主线程,不是“辅助”,是“竞争者”
必须改的 settings.json 配置项
这些配置直接干预语言服务器行为,比禁用插件更治本。全部加到项目级 .vscode/settings.json 中(避免污染全局):
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
-
"typescript.tsserver.log": "off"—— 关闭日志,减少 I/O 和磁盘写入压力 -
"javascript.suggest.autoImports": false—— 自动导入触发全项目符号扫描,关掉立竿见影 -
"files.watcherExclude": { "**/node_modules/**": true, "**/dist/**": true, "**/build/**": true, "**/.git/**": true }—— 告诉 VSCode “别盯这些目录”,Linux/macOS 下防止 inotify 句柄耗尽,Windows 上避免监视队列堵塞 -
"search.exclude": { "**/node_modules": true, "**/dist": true }—— 全局搜索不扫无关目录,间接减轻tsserver索引负担(它会复用搜索索引)
插件启用策略:只留一个语言服务核心
多个 JS/TS 插件共存 = 多个 tsserver 实例打架。你不需要 JavaScript (ES6) code snippets + ESLint + Prettier + Auto Import 同时激活。
- 保留且仅保留
TypeScript and JavaScript Language Features(VSCode 内置,不可卸载)—— 它是所有智能提示的底层 -
ESLint可留,但务必关掉eslint.enable的自动修复(设"eslint.codeAction.showDocumentation": false),把格式化交给 ESLint 规则里的prettier子规则,而非独立插件 -
Prettier插件建议禁用(Disable (For All Folders)),它和 ESLint 插件的formatOnSave易冲突,且自身监听文件变化开销不小 - 彻底删掉
Auto Import、Import Cost、Path Intellisense这类“聪明过头”的插件——它们每打一个字都在后台跑 AST 分析
大型 JS 项目额外要做的两件事
如果你的项目含 Webpack、Vite 配置或大量 require/import 别名,tsserver 默认根本搞不清路径映射,只能硬扫。
- 在
jsconfig.json中显式声明"compilerOptions.baseUrl"和"compilerOptions.paths",让语言服务“知道去哪找模块”,避免 fallback 到暴力遍历 - 加
"typescript.preferences.includePackageJsonAutoImports": "off"——package.json里几十个依赖的types字段,全被当入口扫描,关掉能省掉 40%+ 初始化时间 - 如果项目已用
tsconfig.json,哪怕只是 JS 项目,也建议建一个空的jsconfig.json并设"checkJs": false,强制tsserver不做类型检查,只做基础跳转和补全
最常被忽略的一点:改完配置后必须**重启 VSCode 窗口**(不是重载窗口),否则 tsserver 进程不会重建,旧的监听关系和缓存还在。尤其 files.watcherExclude 类配置,不重启等于没设。

















