Skip to content

Oxfmt:Oxc 格式化工具的首个 Alpha 版本

我们很高兴宣布推出 Oxfmt,这是一款基于 Rust、兼容 Prettier 的代码格式化工具。此首个版本专注于 JavaScript 与 TypeScript,后续将逐步支持更多语言。

Oxfmt 设计目标如下:

  • 性能:首次运行时比 Prettier 快超过 30 倍,比基于 Rust 的 Biome 快超过 3 倍 (基准测试)。
  • 兼容性:完全兼容 Prettier,可轻松在现有项目中采用。
  • 开发者体验:即将推出的特性包括导入排序、扩展格式化选项,以及对 Prettier 插件的支持。

快速开始

oxfmt 添加到你的项目中:

sh
npm add -D oxfmt@latest
sh
pnpm add -D oxfmt@latest
sh
yarn add -D oxfmt@latest
sh
bun add -D oxfmt@latest
sh
deno add -D npm:oxfmt@latest

Oxfmt 遵循 Prettier 的配置格式。如果你正在使用带有 JSON 配置文件的 Prettier,可以将其重命名为 .oxfmtrc.jsonc

bash
cp .prettierrc.json .oxfmtrc.jsonc

你也可以从以下 .oxfmtrc.jsonc 配置示例开始:

jsx
{
  "$schema": "./node_modules/oxfmt/configuration_schema.json",
  // 从 Prettier 迁移时使用 80;100 是 Oxfmt 的默认值!
  "printWidth": 80,
  "ignorePatterns": [] // 与 `.prettierignore` 相同
}

接下来,在 package.json 的 scripts 中添加 oxfmt

jsx
"scripts": {
  "format": "oxfmt"
}

或者参考 安装指南 获取详细说明。

性能

Oxfmt 极其高效。我们在 Outline 仓库上的基准测试结果表明:

  • 比无缓存的 Prettier 实验性 CLI 快超过 30 倍
  • 比通过 @prettier/plugin-oxc 使用 Oxc 解析器的 Prettier 快超过 20 倍
  • 比另一款基于 Rust 的格式化工具 Biome 快超过 3 倍

有关详细的基准测试设置,请参阅以下仓库:

oxc-project/bench-formatter
https://github.com/oxc-project/bench-formatter

设计

Oxc 团队优先考虑与现有生态系统的兼容性,使迁移过程变得简单,即使对于大型代码库也是如此。

代码格式化结果

Oxfmt 的 JavaScript 格式化结果与 Prettier 完全一致。如果你今天开始迁移到 Oxfmt,不应发现与 Prettier 的格式差异。

当你从较旧版本的 Prettier 进行迁移时,可能会看到一些细微差别(查看迁移示例),因为我们识别出 Prettier 在某些格式化方面仍有改进空间。我们已与 Prettier 团队积极协作,直接提交漏洞报告和补丁请求。其中许多改进已合并至最近发布的 Prettier 3.7 版本中。

目前,Oxfmt 已通过了 Prettier 约 95% 的 JavaScript 与 TypeScript 测试用例,我们希望未来能与 Prettier 团队共同推动格式化行为趋于一致。

默认 printWidth: 100

我们选择将默认行宽设为 100,而非 Prettier 的 80。原因包括:

  • TypeScript 代码通常比 JavaScript 更长,因为含有类型注解。
  • 导入语句经常包含多个项。
  • 更大的屏幕提供了更多的横向空间。
  • 可略微减少大模型(LLM)所需的标记数量。

虽然 Oxfmt 保持与 Prettier 的兼容性,但默认行宽为 100 个字符。若想避免从 Prettier 迁移时产生较大的变更差异,可显式将行宽设为 80。

ignorePatterns

尽管 Oxfmt 支持 .prettierignore,还额外提供了 ignorePatterns 配置选项,以便将所有配置集中于一个文件中。

配置

Prettier 的 JSON 配置文件与 Oxfmt 兼容。最简单的迁移方式如下:

bash
cp .prettierrc.json .oxfmtrc.jsonc

如果你的编辑器支持 JSON 语言服务器,可在将 oxfmt 添加到 devDependencies 后,使用以下最小模板作为起点:

json
{
  "$schema": "./node_modules/oxfmt/configuration_schema.json",
  "ignorePatterns": []
}

尽管当前 Alpha 版本尚未支持所有 Prettier 配置选项,但我们已支持以下主要选项:printWidthtabWidthuseTabssemisingleQuotequotePropsjsxSingleQuotetrailingCommabracketSpacingobjectWrapbracketSameLinearrowParensendOfLine,以及 singleAttributePerLine

完整选项列表请参阅我们的 文档

终端输出

Oxfmt 的默认行为等价于 prettier . --write,提供与 cargo fmt 相同的用户体验,并且不输出任何内容。你可以使用 --check 来显示格式化差异,并在 CI 流水线中强制执行 Oxfmt 的使用。

Beta 版本计划

以下是我们的 Beta 版本规划:

你可以在此处追踪我们向 Beta 版本推进的进度:

Formatter Beta · Milestone #15 · oxc-project/oxc
https://github.com/oxc-project/oxc/milestone/15

我们还计划在未来版本中放宽部分格式化规范。

下一步

请参阅 Oxfmt 文档 中的完整安装指南。

报告问题

如遇格式差异,请参考 https://github.com/oxc-project/oxc/discussions/14669
此外,已知问题会通过 标签 区分。

若发现其他问题,请使用 专用模板 在 GitHub 上创建新问题。

加入社区

RFC: Formatter · oxc-project/oxc · Discussion #13608
https://github.com/oxc-project/oxc/discussions/13608

我们诚挚欢迎你的反馈,帮助 Oxfmt 变得更出色!

致谢

Oxfmt 基于 biome_formatter 的一个分支实现,我们感谢 Biome 团队,尤其是 @ematipico@MichaReiser。我们也感谢 Prettier 团队及 @fisker 在格式化兼容性方面的合作。