根本原因是语言服务器(LSP)被node_modules/dist等无关目录拖垮,需配置tsconfig.json的include、禁用autoImports、严格设置files.watcherExclude/search.exclude三项最小化配置。

大型项目中 VSCode 悬浮提示(hover)加载慢、不显示或只显示函数名不带参数,根本不是 hover 功能本身坏了,而是语言服务器(LSP)卡在解析上——它正试图同步扫描整个 node_modules、dist 或未排除的生成目录,内存和 CPU 都被占满,根本没空响应你的悬停。
为什么 hover 在大型项目里经常“失灵”
常见现象包括:光标悬停后 2–5 秒才出提示、只显示 function foo() 而无参数/返回值、Ctrl+K Ctrl+I 完全无反应、状态栏右下角语言服务图标一直旋转。这些都不是网络或插件冲突导致的,90% 是 LSP 启动后被大量无关文件拖垮。TS/JS 项目尤其明显,因为 tsserver 默认会递归遍历所有子目录,哪怕你只打开了一个 src/index.ts。
-
jsconfig.json或tsconfig.json缺失或未配置"include"—— 导致语言服务“不知道该管哪部分”,只好全量扫描 -
files.exclude和search.exclude没配,node_modules、dist、.git等仍参与索引 - 启用了
javascript.suggest.autoImports或typescript.preferences.includePackageJsonAutoImports,LSP 被迫分析每个依赖包的导出结构 - 项目是 monorepo,但没用
references或composite: true分割编译单元,单个 tsserver 扛下了全部 package
必须做的三项最小化配置
不改项目结构也能快速见效。这三项加起来不到 10 行 JSON,却能砍掉 LSP 70% 的无效工作量:
- 在项目根目录补一个最小
jsconfig.json(JS 项目)或tsconfig.json(TS 项目),至少包含:{ "compilerOptions": { "allowJs": true, "checkJs": false }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } - 在
.vscode/settings.json中关闭自动导入:"javascript.suggest.autoImports": false, "typescript.suggest.autoImports": false
- 严格排除无关路径:
"files.exclude": { "**/node_modules": true, "**/dist": true, "**/build": true, "**/.git": true }, "search.exclude": { "**/node_modules": true, "**/dist": true, "**/coverage": true }
monorepo 和超大 TS 项目的进阶控制
如果你的项目有多个 packages/ 或 apps/,且 hover 响应仍慢,说明单个语言服务仍在跨包解析。这时候不能只靠 exclude,得让 TS 主动“分片”:
- 每个 package 下的
tsconfig.json加上:"composite": true, "declaration": true
- 根目录
tsconfig.json用"references"显式声明依赖关系,例如:{ "references": [{ "path": "./packages/utils" }, { "path": "./apps/web" }] } - 禁用全局类型获取:
"typescript.preferences.useAliasesForRenames": false
—— 这个选项默认开启时,tsserver 会在重命名前扫描所有引用位置,大型项目里极易卡住
改完后重启 VSCode(不是 Reload Window),等待右下角出现 TypeScript Server ready 再试 hover。注意:修改 tsconfig.json 后,首次启动可能多等 3–8 秒,这是正常重建语义图的过程;后续 hover 就会稳定在 200ms 内响应。
容易被忽略的“伪优化”陷阱
很多人看到 hover 卡就去调 files.maxMemoryForLargeFilesMB 或开 editor.largeFileOptimizations,这两个对 hover 完全无效——它们只影响**文件打开时的渲染行为**,和语言服务器的解析逻辑毫无关系。同样,禁用 Prettier、ESLint 这类格式化/校验插件也帮不上忙,因为 hover 是 LSP 提供的,不是它们负责的。真正要盯住的只有三件事:LSP 是否已就绪、是否在解析不该解析的路径、是否被 auto-imports 拖累。其他所有“加速设置”都是障眼法。











