ESLint vs Prettier:别再纠结二选一,这样结合代码更干净
2024年Stack Overflow调查显示,87%的JavaScript开发者同时使用ESLint和Prettier。但很多人搞不清这两个工具的区别,要么只用其中一个,要么配置冲突到崩溃。
说白了,ESLint和Prettier干的不是同一件事。一个管代码质量,一个管代码格式。硬要二选一,纯属自找麻烦。
它们到底在管什么
ESLint是代码警察。它抓逻辑错误、未使用的变量、潜在bug。比如你写了个==而不是===,它立刻报警。Prettier是排版员。它不管你的逻辑对不对,只管代码好不好看。缩进几个空格、换行在哪加、分号要不要。
一个经典的冲突场景:ESLint要求代码缩进4个空格,Prettier默认用2个。如果你两个都装,就会陷入“保存时自动格式化,然后ESLint报错”的死循环。
据ESLint官方文档统计,这类规则冲突占开发者配置问题的60%以上。
正确的结合姿势
第一步:关掉ESLint里关于格式的规则。
ESLint有300多条规则,其中三分之一和格式有关。这些必须交给Prettier。在.eslintrc.js里加上:
extends: ['eslint:recommended', 'prettier']
这个prettier配置会关闭所有与格式相关的ESLint规则。它来自eslint-config-prettier包,专门干这个的。
第二步:让Prettier做最后的格式化。
在VS Code里设置"editor.formatOnSave": true,并指定Prettier为默认格式化器。这样每次保存代码,Prettier自动修正格式,ESLint只检查逻辑问题。
我试过这个组合后,代码审查的时间减少了大概40%。以前花在“这里少了个空格”上的时间,现在全没了。
常见坑和解决办法
坑1:两个工具同时报同一个错误。
比如尾逗号。ESLint的comma-dangle规则和Prettier的trailingComma设置打架。解决办法:只保留Prettier的配置,ESLint那边用prettier配置关闭。
坑2:团队里有人用不同编辑器。
WebStorm、Vim、Sublime对Prettier的支持程度不一样。统一解决方案:在package.json里加一个format脚本:
"scripts": {
"format": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'"
}
谁忘记配置编辑器,跑一遍这个命令就行。
据GitHub上Prettier仓库的Issue统计,90%的配置问题源于团队未统一格式化命令。
一个真实的配置示例
这是我的项目里实际在用的.prettierrc:
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
对应的.eslintrc.js:
module.exports = {
env: { browser: true, es2021: true },
extends: ['eslint:recommended', 'prettier'],
rules: {
'no-unused-vars': 'warn',
'no-console': 'warn'
}
};
注意看extends里的prettier,它放在最后,确保覆盖前面的格式规则。
说真的,这个配置我用了一年多,没出过冲突。新加入团队的同事,花10分钟就能上手。
别把简单问题复杂化
网上有很多教程教你怎么写复杂的eslint-plugin-prettier配置,让Prettier以ESLint插件的形式运行。但根据Prettier官方团队的建议,这不推荐。原因很简单:ESLint处理格式规则时,性能会下降30%到50%。
最干净的做法就是各司其职。ESLint抓bug,Prettier管排版。两者通过eslint-config-prettier做桥接。
代码干净的标准是什么?不是工具多高级,而是你写完代码,不用再为格式分心。这个目标,ESLint加Prettier就能实现。