Bun 1.4.4にPrettier互換のbun fmt、約286倍速

Bun 1.4.4にPrettier互換のbun fmt、約286倍速 ニュース

JavaScriptランタイムのBunが、2026年10月22日公開のv1.4.4で、Prettier互換のコードフォーマッタ「bun fmt」を搭載しました。Bunの公式ブログによると、Prettierのリポジトリの2,616ファイルを検査する–checkモードで、Prettier 3.9.10の17.1秒に対して59.7ミリ秒、約286倍の速さだったといいます。既存のPrettier設定ファイルをそのまま読むので、乗り換えの手間は小さめです。

Prettierの設定をそのまま読み、22種類の形式を整形する

bun fmtが整形するのは、JavaScript、TypeScript、JSX、CSS、SCSS、HTML、Vue、Svelte、JSON、YAML、Markdown、GraphQLなど、公式が挙げる形式で22種類です。HTML内の「<style>」やMarkdown内のコードブロックのような、埋め込みコードも対象になります。なお、Publickeyは「20種類」と書いていますが内訳は示していないため、このページでは公式の列挙(22種類)に沿って書いています。TOMLはPrettierの設定が無い場合に限って整形される、という条件つきです。

設定は、次のものを読み込みます。

  • Prettier系:.prettierrc*、prettier.config.*、package.json内の"prettier"、overrides、.editorconfig、.prettierignore
  • oxfmt系:.oxfmtrc.json、.oxfmtrc.jsonc、oxfmt.config.ts(.mtsも可)
  • bunfig.tomlの[fmt]セクション:printWidthやsemiなどをPrettierと同じ名前で指定でき、[[fmt.overrides]]も使えます

Tailwindのクラス並び替え、package.jsonのキー並び替え、Svelteの整形は、Prettier用プラグインなしで動きます(Tailwindの並び替えには、プロジェクトに入っているtailwindcss v3またはv4が必要です)。ただしsortImports、sortTailwindcss、sortPackageJson、jsdocは、デフォルトではオフです。Astroのように、Bunが対応していないプラグインが必要な言語は、プロジェクトにインストール済みのPrettierに任せます。対応していないプラグインを設定すると、該当ファイルをスキップしたうえで、エラーを表示して終了コード2で終わります。

速度は「286倍」と「3〜31倍」、条件を分けて読む

公式ブログの数字は、比べる相手によって大きく変わります。Prettierとの比較は、Prettier公式リポジトリの2,616ファイルを、同リポジトリの設定で整形したもので、bun fmt(–check)は59.7ミリ秒・ピークメモリ48MB、Prettier 3.9.10は17.1秒・459MBでした。vitest、date-fns、monkeytype、h3では、Prettier 3.9.9に対して234〜425倍とされています。

oxfmt 0.74.0との比較は、プロジェクトごとの設定を使った結果です。RSSHub(7,121ファイル)で3.0倍、redocly-cli(3,397ファイル)で3.4倍、vite(2,537ファイル)で6.2倍、fumadocs(2,452ファイル)で31倍でした。Publickeyの見出しにある「最大320倍」は公式Xの投稿にもとづく数字のようで、リリースブログの測定値は286倍と234〜425倍です。oxfmtとの比較では、本文には「3x to 6x faster」とありますが、表のfumadocsは31倍で、表と本文の要約が一致していません。測定は、viteが16コアのM4 Max搭載MacBook Pro、それ以外がIntel Xeon Platinum 8488C(8物理コア、Linux)で行われたものです。自分のプロジェクトでの差は、ファイル数やコア数で変わります。

互換性は99.1%、差異の大半はYAMLの意図的な1ケース

互換性については、Prettier 3.9.9のフォーマットテスト9,731件のうち9,648件が完全に一致したと、公式は書いています(99.1%)。差異の83件のうち64件は、YAMLのブロックスカラー末尾の空行を削除するというPrettierの挙動に合わせない、意図した差異です。そのほかにスキップされたテストが90件あります。

公式が挙げる既知の差異では、Prettierが入力の意味を変えてしまうケースを、bun fmtは保持するとされています。たとえば、CSSのfont-family: Font\ Awesomeを、PrettierはFont\Awesomeに変えますが、bun fmtは元のまま残します。実際のOSSリポジトリを使った比較では、oxfmt 0.72とは240件中227件(94.6%)、Prettierとは74件中57件(77.0%)が一致しました。数字だけ見ると、リポジトリによっては差分が出る前提で試したほうがよさそうです。

まず試すなら、–checkと–staged

導入の入り口として使いやすいオプションは、次のとおりです。

  • bun fmt --check:整形が必要なファイルを一覧にします。書き込みはせず、必要なファイルがあれば終了コード1になります
  • bun fmt --staged:コミット対象のファイルを整形して、再ステージします。pre-commitフックで使えます
  • bun fmt --changed[=ref]:デフォルトブランチ(または指定したref)との差分があるファイルだけを整形します
  • bun fmt --debug-check:整形後に再パースして、意味が変わっていないかを確認します
  • bun fmt --doctor:設定の解釈と、アンインストールできるパッケージを表示します

なお、bun formatは引き続きformatスクリプトを実行する動きのままです。名前が似ているので注意が必要です。

乗り換えの判断材料は、速度より「自分のリポジトリでどれだけ差分が出るか」だと考えています。99.1%はPrettierのテストスイートでの数字で、実際のOSSリポジトリでPrettierと一致したのは74件中57件でした。まずローカルでbun fmt --debug-checkを流して差分を確かめ、出た差分は整形だけのコミットに分けてから、CIを--checkに置き換える順番が安全です。Prettierのプラグインを使っているなら、未対応のプラグインがあると該当ファイルを飛ばして終了コード2になるので、--doctorで設定の解釈を先に見ておくと、CIでの想定外の失敗を避けられます。

出典

2026年10月28日時点の情報です。

タイトルとURLをコピーしました