ESLint 与 Prettier 冲突本质是职责未分离:ESLint 应只检查逻辑错误,Prettier 专责格式化;需用 eslint-config-prettier 关闭 ESLint 所有格式规则,将 "prettier" 置于 extends 末尾,并在 VSCode 中设 editor.defaultFormatter 为 prettier-vscode、禁用 eslint.format.enable、删除已废弃的 prettier.eslintIntegration。

直接结论:ESLint 和 Prettier 冲突不是配置没写全,而是职责没切干净——必须让 ESLint 只管“错不错”,Prettier 只管“好不好看”,否则保存时反复拉扯是必然的。
为什么保存后代码被反复修改?
典型表现是:保存一次,引号从单变双;再保存,又变回单;或者分号忽有忽无。根本原因是 VSCode 同时启用了 editor.formatOnSave(调 Prettier)和 source.fixAll.eslint(调 ESLint 自动修复),而两者对同一格式项(如 quotes、semi)规则相反,又没做隔离。
- ESLint 配了
"quotes": ["error", "single"],但 Prettier 默认用双引号 - VSCode 没指定默认格式化器,结果可能先走 Prettier 再被 ESLint 覆盖,或顺序反过来
-
prettier.eslintIntegration这个旧配置已废弃,启用它反而会让行为不可控
怎么让 ESLint 彻底不管格式?
核心是用 eslint-config-prettier 关掉所有与格式相关的 ESLint 规则,避免和 Prettier 对线。
- 运行
npm install --save-dev eslint-config-prettier(或yarn add -D eslint-config-prettier) - 在你的 ESLint 配置文件(如
.eslintrc.cjs)中,把"prettier"放在extends数组**最后**:
{"extends": ["eslint:recommended", "plugin:vue/vue3-essential", "prettier"]}
注意:顺序不能错。“prettier” 必须在最后,否则会被前面的配置覆盖。
VSCode 设置里哪些关键项不能错?
项目级配置优先于全局,所以直接在项目根目录建 .vscode/settings.json,内容如下:
- 明确指定 Prettier 为默认格式化器:
"editor.defaultFormatter": "esbenp.prettier-vscode" - 关闭 ESLint 的自动格式化能力:
"eslint.format.enable": false(别留默认 true) - 只让 ESLint 做检查和修复逻辑错误:
"editor.codeActionsOnSave": {"source.fixAll.eslint": true} - 开启保存时格式化,但只走 Prettier:
"editor.formatOnSave": true - 禁用旧版冲突开关:
"prettier.eslintIntegration"这一项**必须删掉或设为 false**,它已不兼容 ESLint v8+ 和最新 Prettier
Vue 项目额外要注意什么?
如果你用 Vetur(非 Vue CLI 5.0+ 或 Volar),Vetur 自带的格式化会和 Prettier 抢 .vue 文件的 template 和 script 区块。
- 关掉 Vetur 的 JS/TS 格式化:
"vetur.format.defaultFormatter.js": "none" - 关掉 Vetur 的 HTML 格式化:
"vetur.format.defaultFormatter.html": "none" - 确保
eslint.validate包含"vue",且parser是@typescript-eslint/parser(若用 TS)
如果项目已迁移到 Volar,那直接卸载 Vetur,Volar + ESLint + Prettier 组合更干净,不需要额外关 Vetur 格式化。
最容易被忽略的一点:改完配置后,务必关掉所有 VSCode 窗口再重开,而不是仅重载窗口——插件配置缓存有时不会热更新,尤其是 defaultFormatter 这类底层设置。


















