VSCode代码检查不生效主因是未安装匹配扩展或语言服务器配置错误;需按语言分别配置ESLint、Pylance、Volar等,并设eslint.run为onType等关键参数实现实时诊断。

VSCode 里代码检查不生效,大概率是没装对扩展或没配好语言服务器
语法错误和警告提示不是 VSCode 自带的,它依赖外部语言服务(比如 ESLint、Prettier、tsc、pylsp 等)。光靠内置的 editor.quickSuggestions 或 editor.semanticHighlighting 是不会报错的。
- JavaScript/TypeScript:必须安装
ESLint扩展(dbaeumer.vscode-eslint),并确保项目根目录有.eslintrc.js或eslint.config.js;TS 项目还需确认typescript.tsdk路径正确(默认已内置,但自定义 TS 版本时容易出错) - Python:推荐用
Pylance(ms-python.vscode-pylance)+pylint或flake8;仅装Python官方扩展(ms-python.python)默认只启用了基础 lint,需手动启用python.linting.enabled - HTML/CSS:开箱即用,但若用 Vue 或 SFC,得额外装
Volar并禁用旧的Vetur,否则类型检查会冲突
如何让错误实时显示,而不是保存后才触发
VSCode 默认对很多语言支持「on-type」检查(边写边查),但部分语言服务默认关闭或需显式开启。关键配置项在 settings.json 中:
-
"editor.codeActionsOnSave": { "source.fixAll": true }—— 这是保存时自动修复,不是实时提示,别混淆 - 真正控制实时检查的是:
"editor.quickSuggestions"(影响补全)、"editor.suggestOnTriggerCharacters"(影响输入.[时是否弹建议),但核心是语言服务自身的诊断模式 - 例如 ESLint:必须设
"eslint.run": "onType"(默认是onSave);否则你敲错consol.log,要等 Ctrl+S 才标红 - Python 的
pylance默认就是实时诊断,但如果关了python.analysis.typeCheckingMode(设为off),泛型和类型错误就看不到了
常见错误现象与对应修复动作
看到“没提示”“只有红色波浪线没文字”“警告不出现”,往往不是配置漏了,而是底层服务没起来或被拦截:
- 终端里报错
Failed to load plugin 'react' declared in '.eslintrc.js'→ 检查node_modules是否存在该插件,或运行npx eslint --init重建配置 - Python 文件右下角显示
Python (idle)且无任何提示 → 点击该状态栏,选中正确的解释器路径(尤其虚拟环境路径),再重启窗口 - TS 文件里接口定义没跳转、
any类型不报错 → 查看 VSCode 右下角是否显示TS 5.0.4,若显示Disabled,说明typescript.preferences.includePackageJsonAutoImports或typescript.preferences.enablePromptUseOfNpm导致服务挂起 - 修改了
settings.json但没生效 → 关闭所有文件夹,重新用File > Open Folder...打开项目(工作区设置优先级高于用户设置,且某些配置只在文件夹打开时加载)
性能与稳定性要注意的点
开太多实时检查,编辑器会卡,尤其大项目。不是所有提示都值得“实时”:
- ESLint 的
onType模式对大型 JS 项目可能造成明显延迟,可改用onSave+ 配合eslint.codeAction.showDocumentation快速查规则 - Vue + TypeScript 项目同时启用 Volar 和 ESLint 插件时,
vue.volar.autoImportCompletion和eslint.validate可能重复报告同一个 import 错误,建议关掉 ESLint 的vue验证项(保留["javascript", "typescript"]) - Python 启用
pyright(Pylance 底层)时,python.analysis.extraPaths若指向过深的嵌套目录,会导致首次启动分析超 30 秒,建议只加必要路径
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.run": "onType",
"eslint.validate": ["javascript", "typescript"],
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"typescript.preferences.includePackageJsonAutoImports": "auto"
}
复杂项目里,语言服务之间的边界比想象中模糊——比如 Vue SFC 的 块既走 Volar 的 TS 分析,又受 ESLint 的 vue/multi-word-component-names 规则约束。这时候哪个提示先出来、能否跳转到定义、甚至波浪线颜色深浅,都取决于你关了哪一个开关。










