VS Code 补全依赖语言服务器(LSP)及对应扩展,非泛用“自动补全插件”;需正确安装官方扩展(如 Pylance、rust-analyzer)、配置 settings.json 与 tsconfig.json/jsconfig.json,并重启 TS 服务验证。

VS Code 本身不自带“强大”的补全能力,真正起作用的是语言服务器(LSP)和对应扩展;没装对扩展、没配好 settings.json 或项目级配置,再好的编辑器也只给你返回 undefined。
装对语言服务器扩展,不是装“代码补全插件”
很多人搜“vscode 自动补全插件”,结果装了一堆名字带“Auto Complete”“Smart Suggest”的泛用型扩展——它们基本无效,甚至干扰 LSP 行为。
- JavaScript/TypeScript:必须启用内置的
typescript-language-features(默认开启),禁用第三方 JS 补全扩展 - Python:装
ms-python.python(含 Pylance),别用python-autopep8或python-snippets代替语言服务 - Go:只装
golang.go,确保"go.useLanguageServer": true(默认已开) - Rust:装
rust-lang.rust-analyzer,不是rust(旧版扩展已弃用)
验证是否生效:打开一个源文件,按 Ctrl+Space,看弹出项是否含函数签名、参数说明、文档注释——如果只有变量名或空列表,说明 LSP 没跑起来。
settings.json 关键配置项不能漏
全局或工作区 settings.json 里几个开关直接影响补全质量,尤其在多语言混用或 monorepo 场景下:
-
"editor.suggest.showKeywords": true—— 否则 if/for/return 这类关键字不进补全列表 -
"editor.quickSuggestions": {"other": true, "comments": false, "strings": false}—— 字符串里触发补全是反模式,但普通代码块必须开 -
"editor.suggest.snippetsPreventQuickSuggestions": false—— 否则写for时不会自动弹出 for-loop 模板 - TS/JS 项目务必加:
"typescript.preferences.includePackageJsonAutoImports": "auto",否则 node_modules 里的类型不进提示
注意:这些配置不能靠 GUI 点击设置,必须手动写进 JSON,GUI 设置有时会覆盖或忽略深层字段。
项目根目录的 jsconfig.json 或 tsconfig.json 是补全边界
VS Code 的 TypeScript 语言服务靠 tsconfig.json 确定“哪些文件属于本项目”“哪些路径可被 import”。没有它,或配置了错误的 "include",补全就变成盲猜。
- 新建空项目时,运行
tsc --init生成基础tsconfig.json,哪怕你只写 JS - 确保
"compilerOptions.baseUrl"和"paths"与实际 import 路径一致,否则@/utils这类别名补全失效 - Monorepo 中,每个 package 必须有自己独立的
tsconfig.json,父级配置不会继承 - JS 项目用
jsconfig.json,内容结构同tsconfig.json,但加"checkJs": true才能校验 JS 文件类型
改完配置后,按 Ctrl+Shift+P → 输入 Typescript: Restart TS server 手动重载,别等自动刷新。
补全卡顿、延迟高?先关掉这些“优化”功能
某些看似提升体验的设置,实则让 LSP 反复扫描、阻塞主线程:
-
"editor.suggest.localityBonus": true—— 开启后会优先当前文件变量,但大型文件下计算开销剧增,建议设为false -
"editor.suggest.preview": true—— 预览补全内容需额外解析,老旧机器上明显卡顿,关掉更稳 - 禁用所有非必要扩展,特别是那些监听
onType事件的格式化/校验类插件(如某些 ESLint 实时报告扩展) - 检查
Developer: Toggle Developer Tools控制台是否有Request textDocument/completion failed报错,大概率是某扩展注册了冲突的提供者
最常被忽略的一点:补全响应慢往往不是 VS Code 的问题,而是你项目里 node_modules 太大且没加 "exclude",语言服务器被迫索引几万个声明文件。这时候,tsconfig.json 里的 "exclude" 不是可选项,是必选项。










