为什么Prettier和ESLint配置后代码格式还是不一致?
最近在React项目里同时用了Prettier和ESLint,但保存代码时格式总报错。比如我写个函数:
const greet = (name) => console.log(`Hello ${name}`);
保存时ESLint提示”Expected linebreaks to be ‘unix’ but found ‘windows'”,但Prettier又说没问题。试过装eslint-config-prettier并配置.eslintrc里的formatter,package.json里也加了”prettier”
配置文件这样写:
{
"eslintConfig": {
"extends": ["eslint:recommended", "plugin:react-hooks/recommended", "prettier"]
},
"prettier": {
"semi": false,
"singleQuote": true
}
}
但依然有冲突,有时候格式修正后又出现新错误,感觉配置哪里漏了?
你现在遇到的“linebreaks”报错,其实是ESLint在用自己的规则校验换行符,而Prettier虽然格式化了,但它不会关闭ESLint里那些和格式冲突的规则。所以哪怕你加了"prettier"到extends里,也还得做更多事。
具体来说,有三个关键点你漏了:
第一,
eslint-config-prettier是必须的,它会关掉所有和Prettier冲突的ESLint规则。你虽然写了 extends 里有 "prettier",但你得先安装这个包,不然它不起作用。很多人以为 extend 写了就行,其实 npm 包没装等于白搭。第二,你只用了
prettier配置块在 package.json 里,但 ESLint 不会自动读取它,除非你在.eslintrc里明确告诉 ESLint 使用 Prettier 的配置。或者更好的方式是统一写在一个地方,避免分散。第三,你的编辑器保存时可能只跑了 Prettier,没让 ESLint --fix 跟上,或者顺序不对,导致格式被反复覆盖。
下面是正确的解决方案步骤:
第一步:安装必要的依赖
eslint-config-prettier用来禁用掉 ESLint 中与 Prettier 冲突的规则,比如 semi、quotes、linebreak-style 等。eslint-plugin-prettier是把 Prettier 当成一个 ESLint 规则来运行,这样你执行 ESLint --fix 的时候,就能自动调用 Prettier 格式化。第二步:调整 .eslintrc 配置(建议换成 .eslintrc.js 或 .eslintrc.json)
如果你还在用 package.json 里的 eslintConfig,可以继续用,但为了清晰,我建议拆出来成单独文件。这里以 .eslintrc.js 为例:
注意关键点:我们用了
plugin:prettier/recommended,而不是你自己写的 "prettier"。这个 recommended 配置会自动帮你做三件事:- 启用 eslint-plugin-prettier
- 把 Prettier 的错误作为 ESLint 错误抛出
- 自动应用 eslint-config-prettier 来关闭冲突规则
比你自己手动配要完整得多。
第三步:确保 Prettier 配置能被正确读取
你可以保留 package.json 里的 "prettier" 字段,也可以新建 .prettierrc 文件,内容一样:
重点来了:你之前报的 linebreak-style 错误,是因为 Windows 默认是 CRLF,而 ESLint 推荐的是 LF(unix)。现在你在 Prettier 配置里加上
"lineBreakStyle": "unix",然后通过eslint-plugin-prettier让 ESLint 尊重这个设置,就不会再报错了。第四步:编辑器设置要一致
VS Code 用户最容易踩坑的地方就是保存行为。你需要确保保存时先跑 ESLint --fix,或者至少 Prettier 和 ESLint 不互相覆盖。
在 .vscode/settings.json 加上:
这样做的原理是:不让编辑器默认格式化(避免 Prettier 单独跑),而是让 ESLint 在保存时统一修复所有问题,包括由
eslint-plugin-prettier触发的 Prettier 格式化。这样流程就串起来了。第五步:验证是否生效
写一段测试代码:
const greet = (name) => console.log(Hello ${name});保存后,应该不会出现任何关于分号、引号或换行的警告。如果有,打开命令行跑一下:
看有没有残留错误。如果还有 linebreak-style 报错,说明你 Git 或编辑器还在用 CRLF,可以在项目根目录加个 .gitattributes 文件:
然后重新克隆或执行:
这样从源头解决换行符混乱的问题。
总结一下你原来的问题在哪:
- 缺少 eslint-plugin-prettier,导致 Prettier 没接入 ESLint 流程
- 仅用 "prettier" extend 不够,要用 plugin:prettier/recommended 才完整
- 没统一换行符配置,ESLint 和 Prettier 各自为政
- 编辑器保存逻辑没对齐,格式化顺序乱套
把这些补上,基本就能告别格式战争了。说实话这套配置我调了整整两天才稳下来,现在终于能专心写业务了……
首先,确保你已经安装了这些依赖:
然后修改你的
.eslintrc文件,像这样:注意两点:
1. 把
"plugin:prettier/recommended"加到extends里。2. 在
rules里明确指定prettier/prettier规则为error。接下来是
.prettierrc文件(不要放在package.json里),内容如下:重点来了:加一个
.editorconfig文件,统一换行符格式:最后,确保你的 IDE 或编辑器正确加载了这些配置文件。如果用 VSCode,装个
ESLint和Prettier插件,再设置"editor.codeActionsOnSave"和"editor.formatOnSave"。这样配完应该就没问题了。记得清理下缓存:
npx eslint --cache --cache-location ./.eslintcache . --fix,然后试试保存代码看效果。