vs code“正在解析工作区”卡住主因是tsserver暴力扫描全量文件树,应通过tsconfig.json的include显式限定源码路径、禁用autoimports,并配置files.watcherexclude和search.exclude排除node_modules等目录。

为什么“正在解析工作区”会卡住几十秒甚至几分钟
这不是提示,是 VSCode 正在后台暴力扫描整个文件树——尤其是 TypeScript/JavaScript 项目,tsserver 默认会递归分析 node_modules、dist、.git 甚至你临时解压的 zip 包。它不看 .gitignore,也不管你只改了 src/utils.ts。实测一个含 12 万文件的 Monorepo,首次打开后“解析中”持续 3 分半,CPU 占满,编辑器完全无响应。
关闭全量索引:只留必要路径给 tsserver
核心不是“关掉”,而是“告诉 TypeScript 别瞎看”。必须双管齐下:
- 在项目根目录的
tsconfig.json中显式声明"include",例如:{ "include": ["src/**/*", "types/**/*", "test/**/*"], "exclude": ["node_modules", "dist", "build"] } - 在
.vscode/settings.json中补一刀:{ "typescript.preferences.includePackageJsonAutoImports": "off", "typescript.suggest.autoImports": false } - ⚠️ 注意:
exclude字段在tsconfig.json里只影响类型检查,不影响索引;真正起效的是include—— 没写进include的路径,tsserver根本不会加载其 AST。
阻止 VSCode 自己再偷偷扫描:files.watcherExclude + search.exclude
即使 tsserver 收敛了,VSCode 编辑器自身还会用文件监视器(file watcher)盯所有改动。Mac 上用的是 fsevents,Linux 是 inotify,Windows 是 FindFirstChangeNotification —— 它们对海量小文件极其敏感。
- 在
.vscode/settings.json加入:{ "files.watcherExclude": { "**/node_modules/**": true, "**/dist/**": true, "**/build/**": true, "**/.git/**": true }, "search.exclude": { "**/node_modules": true, "**/dist": true, "**/build": true } } -
files.watcherExclude阻止监听事件触发,比files.exclude更底层;search.exclude则让全局搜索直接跳过这些目录,避免触发二次索引。 - 别信“设成
true就完事”——路径末尾的/**和/有区别:"**/node_modules/**"能排除子目录如packages/foo/node_modules/bar,而"**/node_modules"只能排除顶层。
语言服务级兜底:禁用非必要智能功能
有些“解析”根本不是 TypeScript 干的,而是其他语言服务器在抢资源。比如 Python 项目开着 Pylance,C++ 项目开着 cpptools,它们各自启动独立进程,全都在争内存和文件句柄。
- 按
Ctrl+Shift+P运行Developer: Toggle Developer Tools,切到 Console,输入performance.memory看哪个扩展占堆最多; - 针对性关闭:
{ "python.analysis.indexing": false, "C_Cpp.intelliSenseEngine": "Tag Parser", "javascript.suggest.autoImports": false } -
Tag Parser模式不加载完整语义模型,只做符号标记,C++ 大项目下 CPU 降幅超 50%;但代价是无法跳转到模板特化体或宏展开结果。
真正难搞的不是配置本身,而是“哪些目录该被 include、哪些该被 exclude”得结合你项目的实际结构手工判断——比如 Lerna Monorepo 里 packages/*/src 是源码,但 packages/*/lib 是编译产物,漏掉后者,tsserver 仍会把它当源码反复 parse。这一步没法自动化,只能人眼确认。











