必须配置四项:"editor.codeactionsonsave": {"source.fixall.eslint": true}、"eslint.validate": ["javascript", "typescript", "vue"]、"eslint.options": {"extensions": [".js", ".ts", ".vue"]}、"editor.formatonsave": false;缺一不可,且需项目本地安装eslint并正确加载配置文件。

VSCode 保存时触发 ESLint 自动修复要配哪几项
只开 editor.formatOnSave 不起作用,ESLint 的自动修复必须走 Code Action 通道。核心是启用 editor.codeActionsOnSave 并明确指定修复来源。
常见错误现象:保存后没变化、报错依旧存在、控制台提示 “No ESLint configuration found”。
-
editor.codeActionsOnSave必须设为{"source.fixAll.eslint": true}(不是source.fixAll,后者可能误触其他插件) -
eslint.autoFixOnSave已被弃用,VS Code 1.80+ 版本中完全失效,删掉它 -
eslint.validate要显式列出语言,比如["javascript", "typescript", "vue"],否则 Vue 或 TS 文件不参与检查 - 确保项目根目录有
.eslintrc.js、.eslintrc.json或eslint.config.js(ESLint v9+ 新格式),空配置文件也会导致静默失败
为什么 Prettier 和 ESLint 一起用会互相覆盖分号/引号
因为两者默认规则冲突:ESLint 的 semi 规则要求加分号,Prettier 的 semi: false 会删掉它;ESLint 默认用双引号,Prettier 设 singleQuote: true 就会改写。
这不是 Bug,而是职责未分离——你让两个工具都去决定“代码长什么样”,它们自然打架。
- 正确做法:用
eslint-config-prettier关闭 ESLint 所有格式类规则(如quotes、semi、brace-style) - 再用
eslint-plugin-prettier把 Prettier 当作一条 ESLint 规则运行,统一由 ESLint 触发格式化 - VS Code 设置里只保留
"editor.defaultFormatter": "esbenp.pretterr-vscode",禁用 Vetur 或其他 HTML/JS 格式器,避免多源介入
Vue 项目中 .vue 文件的 ESLint 配置陷阱
Vue 单文件组件包含 <template></template>、<script></script>、<style></style> 三块,ESLint 默认只处理 <script></script>,但很多人误以为整个文件都被校验。
典型问题:模板里写 v-if="xxx" 报错、<style scoped></style> 里的 CSS 变量不识别、setup() 中的响应式语法标红。
- 必须在
.eslintrc.js的overrides里单独配files: ["*.vue"],并设置parser: "vue-eslint-parser" -
parserOptions.parser要嵌套指定 JS 解析器,例如{"javascript": "@babel/eslint-parser"},否则setup语法解析失败 - Vetur 的格式化能力(如
js-beautify-html)和 ESLint 冲突,建议关掉:"vetur.format.enable": false
CI/CD 中 ESLint 检查失败却本地不报错的原因
最常被忽略的是 Node.js 版本和 ESLint 插件版本不一致。本地开发用 Node 20,CI 流水线跑 Node 18,而 eslint-plugin-vue@9 要求 Node ≥18.12,低版本下规则直接跳过,不报错也不校验。
另一个隐形坑是工作区配置覆盖了项目配置:.vscode/settings.json 里写了 "eslint.nodeEnv": "development",但 CI 环境没有这个字段,导致环境变量相关规则失效。
- CI 脚本中显式指定 Node 版本,并运行
npx eslint --version和npx eslint --print-config src/main.js验证实际生效配置 - 把
.vscode/settings.json从 Git 提交中移除,或加注释说明“仅开发使用,不影响 CI” - 团队项目务必在
package.json的engines.node字段锁死最低 Node 版本











