VSCode保存时ESLint不自动fix,需配置"editor.codeActionsOnSave": {"source.fixAll.eslint": true},并确保ESLint插件正确加载项目配置文件、运行环境匹配。

VSCode 保存时 ESLint 不自动 fix,缺的是 editor.codeActionsOnSave 配置
默认情况下,VSCode 的 ESLint 插件只做高亮和提示,save 时不会改代码。要让它动,得手动告诉它:“保存时,对 ESLint 报错执行 source.fixAll.eslint”。这个动作不是开个开关就能有,必须显式声明。
常见错误现象:eslint.validate 配了、eslint.enable 是 true、终端里 eslint --fix 能跑通,但 Ctrl+S 后代码纹丝不动。
- 检查你 VSCode 的
settings.json(全局或工作区)是否包含这段配置 -
"editor.codeActionsOnSave"必须是对象,不能是布尔值;写成true或false完全无效 - 如果项目用了 Prettier,别把
source.fixAll.eslint和source.fixAll.prettier同时设为 true,容易冲突(尤其格式化规则重叠时)
为什么加了 source.fixAll.eslint 还没反应?检查 ESLint 插件是否识别到你的配置文件
VSCode ESLint 插件依赖项目根目录下的 .eslintrc.js、.eslintrc.cjs、eslint.config.js(v8.50+ 新格式)等文件启动。如果插件压根没加载规则,fixAll 就是空转。
使用场景:新建的 React/Vite 项目、Monorepo 子包、或 node_modules 里装了 eslint 但没配 root: true —— 这些都容易让插件“找不到家”。
- 打开命令面板(Ctrl+Shift+P),运行
ESLint: Show Output Channel,看有没有报No ESLint configuration found - 确认
.eslintrc.*文件在当前打开的文件夹(即 VSCode 工作区根目录)下,而不是父级或子级目录 - 如果用的是
eslint.config.js(Flat Config),确保你装的是 ESLint v8.50+,且 VSCode 插件版本 ≥ 2.4.10
editor.codeActionsOnSave 的几个关键参数差异与性能影响
这个配置表面简单,但几个键值组合会极大影响保存体验。不是所有 fixAll 都适合无脑开。
-
"source.fixAll.eslint": true:修复所有可自动修复的问题(包括格式类如semi、quotes)。快,但可能覆盖你手动写的分号风格 -
"source.fixAll.eslint": "explicit":只修复你在问题上右键选了 “Fix all auto-fixable problems” 才触发。更可控,但失去“保存即修复”的便利 - 避免配
"source.organizeImports": true一起开——它和 ESLint 的 import 排序规则(如import/order)常打架,保存后 import 块被反复重排 - 大文件(>1000 行)开启
fixAll可能卡顿 300–500ms,VSCode 不会提示,只会让你觉得“保存变慢了”
遇到 Failed to load plugin 'react' declared in '.eslintrc.js' 类错误怎么办
这是 ESLint 插件在 VSCode 进程里加载失败,和终端里跑 npx eslint 成功完全不冲突。根本原因是 VSCode ESLint 插件默认用它自带的 Node.js 环境,而不是你项目里 node_modules 下的依赖。
典型表现:终端里 eslint --fix src/App.js 没问题,但 VSCode 保存时控制台报插件找不到,codeActionsOnSave 直接静默失效。
- 在
settings.json中加上:"eslint.runtime":"node"(强制走系统 Node) - 或者更推荐:
"eslint.nodeEnv":"development"+ 确保项目package.json里engines.node版本和你本地一致 - 如果用了 pnpm,确认
node_modules/.pnpm下确实装了eslint-plugin-react,且没有peer dep missing警告
真正卡住人的地方,往往不是配置没写,而是 ESLint 插件压根没跑起来——它连配置文件都没读到,后面所有 fixAll 设置都是白搭。先看输出通道,再调配置,顺序错了就一直兜圈子。











