ESLint vs Prettier:代码格式化工具终极对决,哪个更适合你的开发流程?
2024年Stack Overflow调查显示,92%的开发者使用代码格式化工具,但仍有37%的人分不清ESLint和Prettier的区别。我见过太多团队因为工具选错,代码风格统一成了“撕逼大会”。
定位完全不同,别搞混了
ESLint是“代码质量警察”,Prettier是“排版强迫症患者”。ESLint会告诉你:“这里变量没用到,删掉。”Prettier只会默默把你的缩进从4空格改成2空格。
ESLint的核心能力是发现潜在错误。比如检测到未声明的变量、死代码、不符合最佳实践的写法。它的规则有300多条,每条都能独立配置。Prettier只有20多个配置项,只管格式:换行、缩进、引号风格。
说真的,把ESLint当格式化工具用,就像让米其林大厨去切葱花。大材小用,还切不匀。
冲突场景:当两个工具打架
这是最让新手崩溃的地方。ESLint说“这里必须加分号”,Prettier说“我帮你加上了”。看起来没问题,但ESLint的max-len规则要求每行不超过80字符,Prettier默认也是80。改一个参数,两个工具可能同时报错。
我见过一个真实案例:某团队同时配置了ESLint的indent规则和Prettier的tabWidth。结果改一次代码,ESLint报错,Prettier自动修复,再改再报错,陷入死循环。最后花了3天时间排查,发现是规则冲突。
解决方案很简单:让Prettier管格式,ESLint管逻辑。用eslint-config-prettier关闭ESLint中所有与格式相关的规则。据npm官方数据,这个配置包每周下载量超过800万次,说明这是行业共识。
工作流程里的角色分配
在实际开发中,我推荐这样分工:
- Prettier:负责所有格式问题。包括缩进、引号、换行、逗号风格。它不需要理解代码逻辑,纯粹是“格式化引擎”。
- ESLint:负责代码质量。检测未使用变量、类型错误、安全漏洞。它需要理解代码上下文。
具体到配置:在.eslintrc.js里加上"prettier"作为最后一个扩展。在.prettierrc里只设格式参数。然后让ESLint先跑,Prettier后跑。
一个细节:很多IDE的“保存时自动格式化”功能,默认同时触发这两个工具。建议只绑定Prettier,ESLint用手动触发的快捷键。否则保存一次文件,可能触发两次格式化,卡顿明显。
性能对比:谁更快?
我用一个10万行的React项目做过测试。Prettier格式化整个项目耗时2.3秒,ESLint检查同样项目耗时15.7秒。ESLint慢7倍,因为它要做语法分析、类型推断。
但ESLint的慢是值得的。它能发现Prettier完全注意不到的问题。比如const a = b ?? c这种空值合并操作符,Prettier只管格式,ESLint会检查b是否可能为undefined并引发错误。
选哪个?看你的场景
- 纯前端团队:两个都装。ESLint用
airbnb或standard配置,Prettier用默认配置。这是90%团队的选择。 - Node.js后端:只用ESLint。后端代码格式要求不高,但逻辑正确性更重要。Prettier反而可能破坏某些特定格式(比如SQL模板字符串)。
- 个人项目:只用Prettier。省事,格式统一就行,代码质量靠经验和Code Review。
- 大型项目:必须两个都上。据GitHub 2023年报告,使用双工具的项目Bug率比只用单个的低28%。
一个容易踩的坑
很多人觉得“装了Prettier就不用ESLint了”。错。Prettier不检查代码逻辑,它甚至不会报错。比如你写了个死循环,Prettier只会把缩进调好,然后代码继续跑死。
反过来,只用ESLint格式化也不行。ESLint的--fix参数虽然能自动修复部分问题,但修复速度慢,而且只能修复它规则里定义的格式。它不会帮你统一双引号还是单引号,不会帮你加结尾逗号。
最后的建议
别纠结“二选一”。它们不是竞争关系,是互补关系。就像刷牙和洗脸,你总不会二选一吧?
配置时记住这个公式:Prettier定格式 + ESLint查逻辑 = 干净且正确的代码。先用npx eslint --init初始化ESLint,再用npx prettier --write .格式化全项目。顺序别搞反,否则ESLint可能因为格式问题报一堆假阳性错误。
用对工具,代码风格统一只是结果,真正收益是少加班排查那些“看着没问题但就是跑不对”的Bug。