为什么 Prettier 如此稳定?

Prettier 这款流行的 JavaScript/TypeScript 代码格式化器之所以受到称赞,主要在于它的可靠性,以及它如何在团队中统一风格、减少对格式的争论并让代码审查更轻松。评论者认为,它的稳健性来自稳固的底层算法、广泛的测试覆盖和企业支持,但他们也指出了现实中的缺点:与更新的基于 Rust 的工具相比性能较慢、会有破坏性变更或边缘情况 bug(尤其在 HTML 和模板语言中),以及有限的可配置性会让用户感到受限。讨论进一步扩展到:严格且带有强意见的自动格式化器,究竟是对开发实践和团队协作的净收益,还是会鼓励过度依赖并带来不必要的复杂性。

为什么 Prettier 被视为“非常稳定”

  • 许多人认为,它的稳健性与其说来自某个巧妙算法,不如说来自大量测试、对大量边缘情况的打磨,以及长期维护。
  • 一个反复出现的观点是:企业支持(Meta)和有专职维护者的团队,使得可靠性和连续性比仅靠志愿者的项目更有保障。
  • 也有人认为它的真正价值在于团队协作:它把代码审查中的格式争论拿掉,并确保 diff 一致。

算法、IR 与换行

  • 讨论将函数式的“漂亮打印语言”(Wadler 风格)与更临时 / 基于搜索的格式化器(clang-format、YAPF、dartfmt)进行了对比。
  • 换行被一再称为“最难的部分”;gofmt 避免复杂折行被提到是一个很大的简化。
  • 一位格式化器作者解释说,他们重写了自己的 IR,因为缩进和换行以非局部、组合爆炸的方式相互影响。
  • 也有人争论函数式 PPL 风格的方法是否足以表达真实世界中的复杂语言。

Bug、破坏与问题数量

  • 列举了若干具体的 Prettier bug:破坏 XHTML DOCTYPE、移动 TypeScript ignore 注释、弄乱嵌套的 CSS 函数、Django HTML 和 Astro 的问题,以及长期存在的问题。
  • 1000+ 个未关闭 issue 被一些人解读为复杂度高或语言生态“糟糕”的证据;另一些人则认为,对于广泛使用的工具来说这很正常。
  • Prettier 曾在补丁版本中发布会改变行为的格式化更新(例如围绕 JSONC/tsconfig),引发了关于什么算“破坏性变更”以及是否应严格遵循语义化版本的争论。

性能与替代方案

  • 有人抱怨 Prettier 明显比 ocamlformat、ruff 以及基于 Rust 的 Biome 更慢;一些用户主要因为速度而更换。
  • Dprint、Biome、golines,以及各种 lint/format 工具(Black、isort、reorder-python-imports、ESLint Stylistic、standardjs)被提及为替代方案或补充方案。

格式化的理念

  • 有些人认为自动格式化至关重要且令人解放:代码像一种宽松的“速记”来写,再在保存时清理。
  • 也有人觉得 Prettier 平庸、被过度吹捧,或过于武断,并认为相较于逻辑,格式化被高估了。
  • 严格、不可配置的工具(Black、Prettier 默认值)与希望对风格和 diff 有更多控制的团队之间存在张力。
  • 还有少数人担心,过度依赖格式化器会削弱初级开发者对代码审美的感觉;另一些人则认为,与更高层次的能力相比,这是一项低价值技能。