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 fmt | 59.7 ms | 48 |
| Prettier 3.9.10 | 17.1 s | 459 |
フォーマットチェック時間には2桁以上の差がついた。この数値がそのままCIの時間短縮につながるとはいえないため、自分たちのCIでフォーマット工程が何秒を占めるかは別途測定する価値がある。
型チェックの改善幅はリポジトリごとに異なる
表:Bun v1.4.4とv1.4.3のbun check実行時間の比較
条件:8スレッドのLinux x64でコールドラン。キャッシュなしの初回実行を3回測定した最良値。両バージョンが同じエラー数を報告したリポジトリが対象。同社発表。
単位:秒
| リポジトリ | Bun v1.4.3 | Bun v1.4.4 | 倍率 |
|---|---|---|---|
| MUI docs | 10.28 | 1.31 | 7.8 |
| t3code server | 4.59 | 1.62 | 2.8 |
| Supabase studio | 2.84 | 1.27 | 2.2 |
| mikro-orm | 3.30 | 1.82 | 1.8 |
| VS Code | 4.09 | 2.82 | 1.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して動作を確認できる。
条件:npm ws 8.22.0と比較した、書き直されたBun v1.4.4の内蔵実装とそれ以前のバージョンが対象。同社発表。
単位:合格または同一出力のスクリプト数
| 比較項目 | 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倍で、短縮幅はツールとリポジトリによって異なった。
