Prettier + ESLint 集成配置指南 — 以 Vue3 项目为例
背景
在一个 Vue3 + Vite 项目中,同时使用 ESLint(代码质量检查)和 Prettier(代码格式化)时,两者的规则可能冲突。最典型的就是 ESLint 要求最大行长 80 字符,而 Prettier 默认也是 80——看起来一致,但一旦自定义其中一个就可能打架。
解决方案:用 ESLint 驱动 Prettier。通过 eslint-plugin-prettier 将 Prettier 的格式化规则作为 ESLint 的一条规则运行,再通过 eslint-config-prettier 关闭所有与 Prettier 冲突的 ESLint 原生风格规则。
本文以 qiyun_admin 项目的实际配置为例,完整说明集成方式和关键细节。
依赖安装
1 | npm install -D prettier eslint-plugin-prettier eslint-config-prettier |
三个包的分工:
| 包 | 作用 |
|---|---|
prettier |
格式化引擎 |
eslint-plugin-prettier |
将 Prettier 作为 ESLint 的一条 rule 运行 |
eslint-config-prettier |
关闭 ESLint 中与 Prettier 冲突的风格规则 |
如果项目中还没有 ESLint 和 Vue ESLint 支持,还需安装:
1 npm install -D eslint @eslint/js eslint-plugin-vue globals
1. Prettier 配置 — .prettierrc.yaml
1 | # 一行最多字符数 |
关键点:
printWidth: 120— 项目使用的行宽是 120,比 Prettier 默认的 80 更宽松,适合 Vue 模板中较长的属性链。useTabs: true— 使用 Tab 缩进,配合tabWidth: 2让 Tab 显示为 2 个空格宽度。semi: false— 无分号风格。trailingComma: 'none'— 不添加尾逗号,与 ES2017 以来允许尾逗号的趋势不同,这里是团队风格选择。
2. ESLint 配置 — eslint.config.mjs(Flat Config)
项目使用 ESLint 的 Flat Config(eslint.config.mjs,ESLint v9+ 默认格式),而非传统的 .eslintrc.*。
1 | import js from "@eslint/js"; |
集成原理
-
prettierConfig(即eslint-config-prettier) — 必须放在js.configs.recommended和pluginVue配置之后。它会把所有与 Prettier 冲突的 ESLint 原生风格规则全部关闭。如果放反了顺序,样式规则会被后面的配置重新打开,等于没关。 -
prettierPlugin(即eslint-plugin-prettier) — 通过'prettier/prettier': 'error'将 Prettier 的格式化结果作为 ESLint 的一条规则执行。不再额外传入endOfLine选项,直接信任.prettierrc.yaml中的配置。如果团队跨平台遇到换行符冲突(Delete '␍'错误),统一通过.gitattributes解决,见 FAQ。 -
为什么很多 Vue 风格规则设为
'off'— 这些规则(如vue/max-attributes-per-line、vue/html-closing-bracket-newline等)都与 Prettier 的 HTML/Vue 格式化能力重叠。Prettier 对 Vue template 的格式化已经处理了缩进、换行、属性排列,所以关闭 ESLint 侧的同功能规则,避免冲突。
Flat Config 与传统 .eslintrc 的差异注意点
如果你从传统配置迁移到 Flat Config:
| 项目 | 传统 .eslintrc.js |
Flat Config eslint.config.mjs |
|---|---|---|
| 导出 | module.exports = { ... } |
export default [ ... ](数组) |
| 插件注册 | plugins: ['prettier'] |
plugins: { prettier: prettierPlugin } |
| 配置继承 | extends: ['prettier'] |
直接导入并展开到数组 |
| Parser 配置 | parser: 'vue-eslint-parser' |
parser: pluginVue.parsers.vue |
| 忽略文件 | .eslintignore |
ignores: ['dist/**'] |
3. 忽略规则 — .prettierignore
1 | dist/ |
与 ESLint 的 ignores 保持同步,确保构建产物和第三方文件不被格式化。
4. VS Code 配置 — 保存时自动格式化
在项目根目录创建 .vscode/settings.json:
1 | { |
为什么既设
prettier为默认格式化器,又开eslint的fixAll?
- Prettier 格式化器处理所有文件的格式
- ESLint 的
source.fixAll.eslint同时也会触发prettier/prettier规则的修复,双重保险- 两者的修复结果一致(因为 ESLint 内部调用的就是 Prettier)
需要安装 VS Code 扩展:
5. NPM Scripts
在 package.json 中添加:
1 | { |
npm run format— 手动格式化所有源码npm run lint— ESLint 检查并修复(同时也修复 Prettier 问题)npm run lint:check— 仅检查,不修复(用于 CI)
6. Husky + lint-staged(可选)— 提交前自动检查
仅有编辑器保存格式化还不够——总有人忘记安装扩展、或者直接用其他编辑器修改。Husky + lint-staged 可以在 git commit 时自动对暂存文件运行格式化与 ESLint 检查,把住最后一道关。
安装
1 | npm install -D husky lint-staged |
husky init 会在项目根目录创建 .husky/ 文件夹和 pre-commit hook。
配置
.husky/pre-commit
1 | npx lint-staged |
这是 Husky v9 默认生成的 hook 文件,内容只有这一行。
Husky v9 注意:旧版本(v4/v5)需要在
package.json中配置"husky": { "hooks": {...} }或使用.huskyrc.js。v9 统一使用.husky/目录下的 shell 文件,更直观、可版本控制。
package.json 添加 lint-staged 配置
1 | { |
工作流程:
1 | git add src/components/Button.vue |
为什么不直接把
eslint --fix作为唯一的 hook?因为 Prettier 格式化在某些场景下会修改 ESLint 不会触碰的部分(比如 Markdown 换行、YAML 缩进)。先跑 prettier 再跑 eslint,确保两者都通过。
跳过 hook
1 | git commit --no-verify -m "紧急修复:跳过 lint" |
只在万不得已时使用(如修复生产环境紧急 bug)。
7. 工作流程总结
1 | 编辑代码 |
在编辑器层面,Prettier 负责"好不好看",ESLint 负责"对不对"。通过 eslint-plugin-prettier,两者在保存时一次性完成,互不打架。
常见问题
Q: Prettier 格式化的结果和 ESLint 的 fix 结果不一致?
A: 检查 eslint-config-prettier 是否放在了数组的最后(或至少在所有规则配置之后)。Flat Config 中数组顺序决定规则优先级,后面的覆盖前面的。
Q: prettier/prettier 报错 Delete '␍' (prettier/prettier)?
A: 这是换行符冲突。统一团队的 .gitattributes 来解决:* text=auto eol=lf。不再建议在 prettier/prettier 规则中加 endOfLine: 'auto' 覆盖,因为这样会隐藏项目本身的换行符配置问题,而 .gitattributes 是更根本的解决方案。
Q: 配置了项目 .vscode/settings.json,但保存时 Prettier 不生效?
A: 最常见原因:VS Code 用户设置(User Settings)的优先级高于工作区设置(Workspace Settings)。如果你之前在用户设置中强制指定了其他格式化器,会覆盖项目配置。
检查路径:
- macOS:
~/Library/Application Support/Code/User/settings.json - Linux:
~/.config/Code/User/settings.json - Windows:
%APPDATA%\Code\User\settings.json
打开用户设置 JSON,检查是否有以下配置覆盖了项目设置:
1 | { |
VS Code 设置优先级(从低到高):
1 | 默认设置 < 用户设置 < 工作区设置 < 文件夹设置 |
逻辑上工作区设置(.vscode/settings.json)应该覆盖用户设置,但有两点例外:
editor.defaultFormatter的行为:如果用户设置的[language]作用域下指定了格式化器,而工作区设置只在顶层指定了editor.defaultFormatter,前者会胜出。所以项目配置需要同时在语言作用域下设置,如上面第 4 节所示。- 显式排除:用户设置中有
"settingsSync.ignoredSettings": [...]不会同步某些设置,但本地仍生效。
排查步骤:
- 打开命令面板(
Cmd+Shift+P),输入>Developer: Inspect Editor Tokens and Scopes - 右键点击编辑器状态栏的 Prettier 图标,查看当前文件正在使用哪个格式化器
- 或者查看 VS Code 输出面板(
Output),选择 “Log (Window)”,搜索Formatter相关日志
推荐做法:不要在用户设置中设置 editor.defaultFormatter,让每个项目通过 .vscode/settings.json 自行声明。用户设置只放个人偏好(主题、字体、键绑定等)。
Q: 不想让 ESLint 报 Prettier 错误,只想让 Prettier 独立工作?
A: 那就不要用 eslint-plugin-prettier,只保留 eslint-config-prettier(关掉冲突规则)。Prettier 通过编辑器格式化器独立运行。但这样格式化错误不会显示在 ESLint 的问题面板中。
Q: Flat Config 中插件导入报错 “Module not found”?
A: 确保所有 ESLint 相关依赖都已安装(eslint、eslint-plugin-vue、globals、@eslint/js、eslint-plugin-prettier、eslint-config-prettier)。Flat Config 使用 ESM 的 import 语法,不要用 require()。

