别再让 Prettier 和 ESLint 一起做格式化了
有一种更干净的方式,我一年前就已经切换了
多年来,ESLint 和 Prettier 的组合已经成为许多 JavaScript 项目中一种不成文的标准。ESLint 负责检查代码逻辑,Prettier 确保代码风格一致。两者分工明确,乍看之下像是天作之合。
但在不同规模的几个项目中使用之后,我开始发现现实并没有那么简单。
不撞上就不会发现的冲突
我遇到的第一个问题就是规则冲突。ESLint 有自己的代码风格规则——比如使用单引号还是双引号、最大行宽、是否保留尾随逗号等。Prettier 对同样的问题也有自己的看法。
当两者同时启用时,它们可能会相互冲突。你保存文件,Prettier 按照自己的方式重新格式化,然后 ESLint 立即将其标记为违规。这个循环可能在几秒钟内发生,调试起来非常令人困惑,因为错误会无缘无故地出现又消失。
确实有 eslint-config-prettier 这个工具来解决这个问题——它的做法是关闭所有可能与 Prettier 冲突的 ESLint 规则。但这只是转移了复杂性,而不是消除它。你现在需要理解三个层面:ESLint、Prettier,以及协调它们之间关系的配置。
大型项目中的速度问题
在小型项目中,性能差异不太明显。但当代码库开始增长到数百个文件、甚至超过一千个时,运行两个不同的工具来处理相同的文件就开始变得有感知了。CI 流水线中的 lint 时间会明显拉长,保存文件时的开发者体验也会受到影响。
这不是一个无法容忍的问题,但已经足够让人烦恼,促使我开始寻找替代方案。
ESLint Stylistic:一个工具,一份配置
ESLint Stylistic 是 ESLint 团队的官方插件,它接管了之前经常委托给 Prettier 的格式化职责。有了它,你可以将所有的 lint 规则——无论是逻辑检查还是风格规范——都放在同一个地方、用同一份配置来管理。
结果要干净得多。不再有两份相互交互的配置文件,不再需要额外的插件来桥接它们。我已经在几个 Vue 项目中使用了这个方案,效果一致且易于预测。
Biome:如果想要走得更远
Biome 是一个用 Rust 编写的工具,旨在同时取代 ESLint 和 Prettier。它的执行速度非常显著——即使在大型项目中,整个过程也几乎是瞬间完成的。它的配置也简单得多:一个 biome.json 文件就能管理所有事情。
唯一需要注意的是,它的生态系统还没有 ESLint 那么完善。你可能依赖的特定插件在 Biome 中不一定可用。因此,如果你的项目依赖于某些特定的 ESLint 插件,在完全切换之前请先做好评估。
对于新项目,我的建议很明确:直接使用 ESLint Stylistic 而不搭配 Prettier,或者如果你不需要特定的 ESLint 插件,可以直接尝试 Biome。对于已经在运行的项目,迁移需要一些努力,但结果是值得的——尤其是从配置层面来看,更容易被整个团队所理解。
