BunはJavaScript・TypeScriptアプリの実行とパッケージインストール、テストをまとめた開発ツールだ。10月22日公開のv1.4.4は、内蔵フォーマッターを追加し、型チェック時間を短縮した。対応言語・プラグインと設定が合うプロジェクトでは、コードの整形と型チェックをBun内で完結できる。

既存の設定でフォーマットチェックまで

新しいフォーマッターは既存の設定を活用する。bun fmtはPrettier・oxfmtの設定を読み込む。同社はPrettier 3.9.9の独自テストで、9,731件中9,648件に当たる99.1%がバイト単位で一致したと発表した。

複数プロジェクトのチェックでは重複作業を減らした。同社の測定で、bun check -bは生成したモノレポ(独立プロジェクト4,000個・各ファイル5個)において13.65秒から0.87秒へと15.7倍高速化した。条件はskipLibCheck: true、16コアM4 Max、6回中の最良値だ。宣言ファイルの解析結果・モジュール解決キャッシュ・出力ファイル一覧をプロジェクト間で共有し、それぞれがコピーを保持していた重複を減らした。

パッケージインストールは短時間の障害に耐えられるよう、失敗するほど再試行間隔を延ばす。同社の測定では、レジストリが1秒間503を返すとv1.4.3は7 msで失敗したが、v1.4.4は1.6秒でインストールを完了した。

依存関係を上位フォルダーにまとめるインストールも高速化した。同社の測定では、Linux・パッケージキャッシュあり・パッケージ1,000個(各ファイル30個)・空のインストールフォルダー・8コアの条件でインストール時間が381 msから120 msに短縮され、約3.2倍高速化した。

表:Prettierリポジトリでのフォーマットチェック時間と最大メモリの比較

条件:Prettierリポジトリの2,616ファイルに独自設定を適用したbun fmt --checkとPrettier 3.9.10の比較。Intel Xeon Platinum 8488Cの8コアに固定・Linux・ウォームファイルキャッシュでの中央値。同社発表。

単位:フォーマットチェック時間はmsとs、最大メモリはMB

既存の設定でフォーマットチェックまで
ツールフォーマットチェック時間 (ms/s)最大メモリ (MB)
bun fmt59.7 ms48
Prettier 3.9.1017.1 s459

フォーマットチェック時間には2桁以上の差がついた。この数値がそのままCIの時間短縮につながるとはいえないため、自分たちのCIでフォーマット工程が何秒を占めるかは別途測定する価値がある。

型チェックの改善幅はリポジトリごとに異なる

表:Bun v1.4.4とv1.4.3のbun check実行時間の比較

条件:8スレッドのLinux x64でコールドラン。キャッシュなしの初回実行を3回測定した最良値。両バージョンが同じエラー数を報告したリポジトリが対象。同社発表。

単位:秒

Bun v1.4.4とv1.4.3のbun check実行時間の比較 (秒)MUI docs: Bun v1.4.3 10.28, Bun v1.4.4 1.31; t3code server: Bun v1.4.3 4.59, Bun v1.4.4 1.62; Supabase studio: Bun v1.4.3 2.84, Bun v1.4.4 1.27; mikro-orm: Bun v1.4.3 3.30, Bun v1.4.4 1.82; VS Code: Bun v1.4.3 4.09, Bun v1.4.4 2.82Bun v1.4.3Bun v1.4.4MUI docs10.281.31t3code server4.591.62Supabase studio2.841.27mikro-orm3.301.82VS Code4.092.82
Bun v1.4.4とv1.4.3のbun check実行時間の比較 (秒)
型チェックの改善幅はリポジトリごとに異なる
リポジトリBun v1.4.3Bun v1.4.4倍率
MUI docs10.281.317.8
t3code server4.591.622.8
Supabase studio2.841.272.2
mikro-orm3.301.821.8
VS Code4.092.821.4

リポジトリごとに幅は異なったが、方向性は同じだった。同社は、別途測定した76リポジトリ中69で10%を超える高速化が見られたと発表した。

アップグレード方法

# 新規インストール
curl -fsSL https://bun.sh/install | bash

# または npm、Homebrew
npm install -g bun
brew tap oven-sh/bun
brew install bun

# すでにインストール済みなら
bun upgrade

切り替え前に、型チェッカーのTypeScript 7基準の設定を確認する。フォーマットチェックはbun fmt --checkで実行し、修正が必要なファイルがあれば終了コード1を返す。

破壊的変更については、まず次を確認する。

Bun.Globの*(1).txtは、今後「0個以上の1の後に.txt」と解釈される。*[(]1).txtで従来の動作を維持できる。wsサーバーのアイドルタイムアウト・自動pingがなくなり、デフォルトのmaxPayloadは16 MiBから100 MiBに増える。インストールコマンドは、どのパッケージマネージャーも対応していないフラグをエラーとして扱う。--frozen-lockfilのようなタイプミスが該当する。

DB転送はメモリを一定に維持

DBを接続したサービスでは、Bun.SQLのクエリ当たりのコストが減った。同社の発表によると、Linux x64のPostgreSQLで特定の行を検索するクエリのクライアント側ユーザー空間の命令数が48%減少した。

大容量コピーにはCOPYストリームのバックプレッシャーが働く。消費速度に合わせて転送を調整するため、テーブル全体のサイズに応じてメモリが膨らむことはない。同社の測定では、1,000 MiBを毎秒255 MiBで転送しながら、最大常駐メモリを59 MiBに維持した。

Node.jsでwsを使ってきたチームは、パッケージを入れ替えずにBunでwsをそのままimportして動作を確認できる。

表:ws内蔵実装の互換性指標の比較

条件:npm ws 8.22.0と比較した、書き直されたBun v1.4.4の内蔵実装とそれ以前のバージョンが対象。同社発表。

単位:合格または同一出力のスクリプト数

ws内蔵実装の互換性指標の比較
比較項目Bun v1.4.4以前のバージョン
ws独自テスト合格234 / 271 件94 / 271 件
クライアントスクリプトの同一出力179 / 212 件18 / 212 件
サーバースクリプトの同一出力150 / 159 件67 / 159 件

Bunの従来の内蔵ws実装をws 8.22.0の移植で書き直し、スクリプトの出力がそのまま一致するケースが増えた。フレームと圧縮は引き続きネイティブで処理する。

同社の測定ではフォーマットチェックに2桁以上の差がつき、実際のリポジトリの型チェック改善は1.4~7.8倍で、短縮幅はツールとリポジトリによって異なった。