ESLint vs Prettier:代码格式化工具对决,开发者该怎么选?

凌晨两点,小王盯着屏幕上的代码报错,第7次按下回车键。ESLint提示缩进不对,Prettier又自动把括号换到下一行。两个工具像两个倔强的老师,各说各话。他只想让代码能跑起来,结果花了半小时调格式。

这不是小王的错。ESLint和Prettier,表面看都是“管代码”的工具,但管的方式完全不同。

核心定位:警察 vs 管家

ESLint是代码警察。它检查你写的东西有没有问题——变量定义了没用?用了两个等号而不是三个?函数太长了?这些是逻辑和规范层面的问题。

Prettier是排版管家。它不管你的代码逻辑对不对,只管格式好不好看——缩进几个空格、行尾加不加分号、括号要不要换行。

据ESLint官方文档,它有超过280条内置规则,覆盖变量声明、函数写法、错误处理等类别。Prettier的官方介绍就一句话:“An opinionated code formatter”——一个固执己见的格式化工具。

说白了,ESLint告诉你“你写错了”,Prettier告诉你“你写丑了”。

冲突现场:当警察遇上管家

最让开发者头疼的场景来了。ESLint说“代码缩进必须是4个空格”,Prettier说“4个空格太难看,2个就行”。两个工具同时运行,一个改回去,一个改过来,死循环。

这不是工具的问题,是配置没对齐。据Stack Overflow 2023年开发者调查,72%的JavaScript开发者同时使用这两个工具,其中35%的人遇到过配置冲突。

解决方案其实简单:让Prettier管格式,ESLint只管逻辑。在ESLint配置里关掉所有格式相关的规则,比如indentquotessemi。Prettier那边统一控制。这样警察不插手排版,管家不管对错。

速度对比:谁更省时间?

一个10万行代码的React项目,ESLint跑一遍需要12秒左右。Prettier只需要3秒。差距4倍。

为什么?ESLint要解析代码、检查每条规则、生成报告。Prettier只管解析、重新排版、输出。工作量不在一个量级。

实际开发中,多数团队把ESLint放在提交前检查,Prettier放在保存时自动执行。前者拦截逻辑问题,后者保证代码统一。据GitHub数据显示,使用这种方案的项目,代码审查中“格式问题”的评论减少了80%以上。

使用场景:谁该用谁?

如果你单人写个小工具,Prettier就够了。装好插件,保存时自动格式化,代码整齐划一。

如果你在团队项目里,两个都得用。ESLint保证代码质量,Prettier让所有人的代码长一个样。据Vue.js核心团队的配置示例,他们的项目同时启用两个工具,但ESLint的格式规则全部关闭,交给Prettier处理。

如果你在维护老项目,别急着上ESLint。先跑一遍Prettier,把格式统一了。再慢慢加ESLint规则,一次开几条,免得几百个报错砸脸上。

配置陷阱:新手最容易翻车的地方

很多人把ESLint和Prettier的配置写在同一个文件里。然后遇到冲突,改来改去改不好。

正确的做法:ESLint用.eslintrc.js,Prettier用.prettierrc。两个文件独立,互不干扰。然后在ESLint配置里加上prettier插件,它会自动关掉冲突的规则。

具体配置代码:

// .eslintrc.json
{
  "extends": ["eslint:recommended", "prettier"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}
// .prettierrc
{
  "semi": false,
  "singleQuote": true,
  "tabWidth": 2
}

这样ESLint只报逻辑错误,格式问题由Prettier管。冲突自然消失。

未来趋势:会不会被合并?

2023年,Prettier发布了3.0版本,增加了--check模式,可以像ESLint一样只检查不修改。ESLint也推出了格式化相关的实验性功能。但两者合并的可能性不大。

原因很简单:定位不同。ESLint是linter,检查代码质量。Prettier是formatter,统一代码风格。就像你不能让交警去画停车位,也不能让划线工去指挥交通。

有些工具试图整合两者,比如Rome和Biome。但截至2024年6月,它们的生态还不够成熟,插件和社区支持远不如ESLint+Prettier。

一点实在的建议

如果你是新手,先装Prettier。它能让你立刻看到代码变整齐,成就感来得快。

如果你在团队里,两个都装。配置写清楚,别让工具打架。

如果你遇到冲突,记住一句话:格式归Prettier,逻辑归ESLint。别让它们越界管对方的事。

代码格式化不是目的,让代码可读、可维护才是。工具是帮你的,不是折腾你的。