vscode波浪线由ts/html/json等内置语言服务与eslint等插件并行生成,互不融合、各自独立;悬停可识别来源,需按来源精准配置禁用或调整优先级。

VSCode 本身没有内置“纠错规则”——所有语法检查、修复行为都来自插件,不存在“融合”前提,只有“谁在管、谁优先、谁被禁用”的实际控制权分配。
为什么你看到的“波浪线”不全是 ESLint 报的
VSCode 的语言服务(如 TypeScript Server、HTML Language Service)自带基础校验能力,比如:TS2304(找不到名称)、html-validate(非法属性)、jsonc.parseError(JSON 格式错)。这些不是插件加的,是 VSCode 内置语言支持直接输出的。它们和 ESLint / Stylelint 等插件规则并存,但互不感知、不合并、不协商。
- TS 错误优先级通常高于 ESLint:哪怕
no-unused-vars关了,TS 仍会标出未使用的const foo = 1 - HTML 中
vue/no-parsing-error和内置html-validate可能同时报同一行,但错误码、提示文案、是否可修复完全独立 - 内置校验不走
editor.codeActionsOnSave,所以不能被source.fixAll.eslint一键修掉
如何让 ESLint 规则不和 TS 内置检查打架
常见冲突点:TS 提示 Parameter 'x' implicitly has an 'any' type,ESLint 却没报;或反过来,ESLint 的 @typescript-eslint/no-explicit-any 开了,但 TS 已经更早标红了——这不是 bug,是职责重叠。
- 明确分工:把类型相关规则全交给 TS 处理,ESLint 配置里禁用
@typescript-eslint/no-explicit-any等重复项(除非你要更严) - 确保 parser 正确:
parser: '@typescript-eslint/parser'必须存在,否则 ESLint 根本不解析 .ts 文件,只靠 TS Server 单独干活 - 关闭 ESLint 对类型检查的模拟:在
rules里显式关掉no-undef、no-unused-vars(TS 自己管),避免双头报错 - VSCode 设置中确认
"typescript.preferences.includePackageJsonAutoImports": "auto",否则 TS Server 可能漏判 import 错误
Stylelint 和 VSCode CSS 内置校验怎么共存
CSS 文件默认由 VSCode 自带的 CSS Language Service 校验(比如 Unknown property 'disply' 拼写错),而 Stylelint 负责更高级规则(selector-max-id、color-no-invalid-hex)。两者不冲突,但容易混淆来源。
- 右键点击波浪线 → “Quick Fix” 或 “Show Problem” 可看错误来源是
css还是stylelint - Stylelint 不修复拼写类错误(那是内置 CSS 服务的事),只修它自己定义的可修复规则(如
indentation、max-line-length) - 必须启用
"stylelint.enable": true,否则即使装了插件,也不会跑规则;且.stylelintrc.*文件必须存在,否则状态栏不显示 Stylelint 图标 - 若用 SCSS,需额外在
settings.json加"stylelint.validate": ["css", "scss"],否则 .scss 文件里规则静默失效
最易被忽略的控制点:错误来源优先级不可调,但可屏蔽
你无法让 ESLint 的错误覆盖 TS 的红色波浪线,也无法让 Stylelint 的警告变成错误——VSCode 不提供“规则融合层”。唯一可控的是显示与触发:
- 通过
"problems.exclude"屏蔽某类来源的提示,例如:"**/*.js": {"css": true}(关掉 JS 文件里的 CSS 校验) - 用
"eslint.options" → "overrideConfigFile"指定不同目录用不同规则,避免根目录配置污染子项目 - 多语言文件(如
.vue)要分段配验证器:eslint.validate里声明{"language": "vue", "autoFix": true},否则 template/script/style 块可能只有一部分被 ESLint 扫到 - 所有“自动修复”动作最终都落到
editor.codeActionsOnSave的具体 key 上,source.fixAll是泛匹配,极易误触非预期插件——永远用精确路径,如source.fixAll.eslint











