10月22日、Bunが「Bun v1.4.4」と題した記事を公開した。JavaScriptランタイム「Bun」のv1.4.4では、Prettier互換のコードフォーマッターbun fmtの追加、TypeScript型チェックbun checkの大幅高速化、bun installの信頼性向上など、実務に直結する改善が複数含まれている。
なかでもbun fmtは、Prettierとのバイト単位の互換性を99.1%維持しながら最大286倍速いという数字が開発者コミュニティで話題を呼んでいる。既存の.prettierrcや.editorconfigをそのまま読み込めるため移行コストが低く、大規模コードベースを抱えるチームほど恩恵を受けやすいリリースだ。
目玉はbun fmt:Prettierの286倍速いフォーマッター
bun fmtは、JavaScriptエコシステムで広く使われるコードフォーマッターPrettierの互換実装をBunに組み込んだものだ。Prettierの公式リポジトリ(2,616ファイル)で計測したところ、以下の結果が出ている。
| ツール | 実行時間 | ピークメモリ |
|---|---|---|
| bun fmt | 59.7 ms | 48 MB |
| Prettier 3.9.10 | 17.1 s | 459 MB |
286倍速く、メモリ使用量は約10分の1だ。vitest、date-fns、monkeytype、h3といった実プロジェクトでも234〜425倍の差が確認されている。
Rustベースのフォーマッターoxfmt(OXCプロジェクトが開発)と比較しても3〜31倍速い。oxfmtはすでに高速なフォーマッターとして知られているが、bun fmtはさらに上回る結果となった。
対応言語は幅広い。JavaScript、TypeScript、JSX、CSS、SCSS、Less、HTML、Vue、Svelte、Angular、JSON、YAML、TOML、Markdown、GraphQLなど20種類以上に対応する。HTMLの<style>タグ内やMarkdownのコードブロック内といった埋め込みコードも自動フォーマットされる点も実用的だ。
既存設定をそのまま使える
.prettierrcやpackage.jsonの"prettier"フィールド、.editorconfig、.prettierignoreをそのまま読み込む。oxfmtの設定ファイルにも対応している。CLIフラグもPrettierと同じものが使えるため、CI設定の変更も最小限で済む。
インポートのソートも組み込み済みで、@trivago/prettier-plugin-sort-importsなどのプラグインは不要になる。またprettier-plugin-tailwindcss、prettier-plugin-packagejson、prettier-plugin-svelteの機能も内蔵されており、これらのプラグインをアンインストールできる。
便利なオプション群
- **
--check**:フォーマットが必要なファイルを列挙し、あれば終了コード1で終了 - **
--staged**:コミット対象のファイルだけフォーマットして再ステージング。コミット前の自動フォーマットに使うlint-stagedが不要になる - **
--changed**:デフォルトブランチとの差分ファイルのみフォーマット - **
--doctor**:Bunがどの設定を読んでいるかを確認し、アンインストール可能なパッケージを表示
コマンド名はcargo fmt、go fmt、deno fmt、zig fmtと同じ慣習に倣っている。
Prettierとの互換性
Bun自身のCIで、Prettier 3.9.9の公式フォーマットテスト9,731件を毎コミット実行している。99.1%(9,648件)がバイト単位で一致する。
意図的に差異を設けているケースもある。Prettierがコードの意味を変えてしまう一部の入力(CSSのエスケープ文字やHandlebarsのコメント処理など)について、bun fmtは元の意味を保持する方針をとっている。
bun checkが最大7.8倍高速化
bun checkは、BunがTypeScriptの型チェックを実行するコマンドだ(tsc --noEmitに相当する)。Bunはランタイムとしてトランスパイルは高速にこなす一方、型チェックはTypeScriptコンパイラーに依存する部分が残っていたが、v1.4.4では内部実装を見直し大幅な高速化を実現した。
| プロジェクト | Bun v1.4.4 | Bun v1.4.3 | 高速化 |
|---|---|---|---|
| MUI docs | 1.31 s | 10.28 s | 7.8x |
| t3code server | 1.62 s | 4.59 s | 2.8x |
| Supabase studio | 1.27 s | 2.84 s | 2.2x |
| VS Code | 2.82 s | 4.09 s | 1.4x |
MUI docsではピークメモリが11.2 GBから1.3 GBに減少した。76のリポジトリのうち69が10%以上高速化されている。
モノレポ向けのbun check -bも強化された。プロジェクト間でパース済み宣言ファイルやモジュール解決キャッシュを共有するようになり、4,000プロジェクト規模の環境では15.7倍速くなっている。
bun installの改善
Yarn Berry(v2以降)のロックファイル移行に対応
bun installがYarn 2+(通称「Berry」)のyarn.lockをbun.lockに変換できるようになった。Yarn Berryはv2以降のYarnを指し、v1とは内部アーキテクチャが大きく異なる。v1.4.3ではYarn v1のみ対応していたため、BerryプロジェクトをBunに切り替えると依存関係を全て再解決する問題があった。v1.4.4ではワークスペース、npm:エイリアス、resolutions、gitやtarball依存なども保持される。
指数バックオフによるリトライ
以前は失敗したリクエストを5ms以内に5回リトライするだけだったため、レジストリが少し不安定になっただけでインストールが失敗していた。v1.4.4では初回リトライまで50ms待ち、その後100、200、400、800msと倍増していく。±20%のジッターを加えることで、複数のクライアントが同時にリトライして再びサーバーを過負荷にする「雷鳴問題」も回避している。Retry-Afterヘッダーも最大60秒まで尊重する。
v1.4.4はbun fmtの追加だけでも移行を検討する理由になりうるリリースだ。bun checkの高速化とメモリ削減もあわせて、TypeScript開発のフィードバックループを短縮したい開発者には試してほしい。
詳細はBun v1.4.4を参照していただきたい。