根本原因是tsserver默认递归扫描整个工作区(含node_modules、dist等),导致内存/cpu飙升、补全跳转延迟;需通过tsconfig.json的include/exclude显式限定范围,并在.vscode/settings.json中关闭autoimports、日志等冗余功能。

为什么 TypeScript/JavaScript 项目依赖解析特别慢
VSCode 的 TypeScript 语言服务(TSServer)默认会递归扫描整个工作区,包括 node_modules、dist、build 等目录,导致内存暴涨、CPU 占用高、补全/跳转延迟明显。这不是插件问题,而是语言服务器本身的行为——它试图为所有导入路径建立完整符号图。
常见现象包括:打开文件后光标卡顿 2–3 秒、Ctrl+Click 跳转失败、import 补全列表空白或延迟弹出、状态栏长期显示 “Initializing JS/TS language features”。
- 根本原因不是“项目大”,而是 TSServer 默认加载了所有
node_modules/@types和嵌套子包的类型声明 - 即使你只编辑一个
src/utils.ts,它也可能在后台解析node_modules/lodash-es的全部 800+ 个模块声明文件 -
typescript.preferences.includePackageJsonAutoImports开启时,还会主动读取每个package.json的types字段并预加载
禁用自动导入 + 关闭日志 + 限制作用域
这些设置直接干预 TSServer 启动行为,不依赖插件,生效快、副作用小。
- 在工作区根目录的
.vscode/settings.json中添加: -
"typescript.tsserver.log": "off"—— 关闭冗长日志,避免磁盘 I/O 拖慢启动 -
"javascript.suggest.autoImports": false和"typescript.suggest.autoImports": false—— 阻止自动扫描node_modules寻找可导入项 -
"typescript.preferences.includePackageJsonAutoImports": "off"—— 彻底禁用基于package.json的类型推导 - 如使用 TypeScript Project References,确保每个子项目有独立的
tsconfig.json,并在根tsconfig.json中用"references"显式声明依赖,避免单个 TSServer 加载全部
用 files.exclude 隔离无关目录,但别只信它
files.exclude 只影响资源管理器显示和文件搜索,**对 TSServer 解析无任何作用**。很多用户配了却没改善,就是因为误以为它能“屏蔽类型扫描”。
真正起效的是 typescript.preferences.suggestionActions.enabled 和 typescript.preferences.useLabelDetailsInCompletionEntries 这类底层控制项,但更直接有效的是配合 tsconfig.json 的 "exclude" 和 "include":
- 在项目级
tsconfig.json中明确写死: -
"include": ["src/**/*"]—— 仅让 TSServer 关注源码 -
"exclude": ["node_modules", "dist", "build", "test"]—— 强制排除,比 VSCode 设置更底层 - 若用 Monorepo,每个包必须有自己的
tsconfig.json,且不能共用一个全局配置;否则 TSServer 会把所有包当作同一项目加载
Java/Maven 项目依赖解析卡住的典型误判点
Java 扩展(如 Red Hat Java)同样依赖语言服务器(JDT LS),但它卡顿的根源常被当成“网络慢”。实际高频问题是本地缓存污染或镜像配置未生效。
- 检查
~/.m2/settings.xml是否真被 VSCode 读取:执行mvn help:effective-settings,确认<mirrors></mirrors>已出现在输出中 - VSCode Java 扩展不会自动继承系统 Maven 配置,需在设置中显式指定路径:
"java.configuration.maven.userSettings"指向你的settings.xml - 频繁出现 “Resolving dependencies…” 卡住超过 60 秒?大概率是 JDT LS 正在尝试解析一个损坏的本地 jar(比如
xxx-1.0.0-SNAPSHOT.jar缺少META-INF/MANIFEST.MF),删掉对应~/.m2/repository/xxx目录重试 - 禁用
java.compile.onSave是最立竿见影的优化——保存即编译会触发全量依赖重解析,改为手动运行mvn compile或绑定到构建任务
真正容易被忽略的是:TypeScript 的 exclude 和 Maven 的 settings.xml 都需要“显式声明才生效”,VSCode 不会替你猜测哪些目录该跳过。不写进配置文件,就等于没关。











