Bun 1.2は、JavaScript・TypeScriptのランタイム、パッケージ管理、テスト、ビルド機能をまとめたBunのメジャーアップデートです。2025年1月22日の公式発表では、Node.js互換性の改善、S3とPostgresの組み込みクライアント、テキスト形式のロックファイルが主要変更として紹介されました。
Bun 1.2を短く整理
記事情報: 2025年12月2日初出。Bun 1.2の仕様と現在の公式資料を2026年7月25日に再確認しています。
Bun 1.2で注目すべき変更は次の4点です。
- Node.jsのテストスイートを継続的に実行し、互換性を検証する体制へ移行した
node:http2サーバー、node:dgram、node:clusterなどの対応が進んだ- オブジェクトストレージを扱う
Bun.s3と、Postgresを扱うBun.sqlが加わった - 新規プロジェクトの既定ロックファイルが、バイナリの
bun.lockbからテキストのbun.lockへ変わった
「Node.js向けパッケージがすべて動く」という発表ではありません。公式リリースノートも、V8のC++ API互換には未対応部分が残ると説明しています。既存アプリの移行では、依存パッケージ、ネイティブアドオン、運用環境を個別に試す必要があります。
Node.js互換性はどう改善されたか
Bun 1.2では、Node.jsのテストスイートから移植したテストを変更ごとに実行する方針が示されました。単に「npmパッケージの何割が動く」と表現するより、どのAPIのどの挙動を継続検証しているかを確認できる点が重要です。
HTTP/2、UDP、cluster
node:http2はクライアントだけでなくサーバーにも対応し、gRPCサーバーに必要な基盤が加わりました。node:dgramではUDPソケットのbindとconnectを扱えます。node:clusterでは複数のBunプロセスを起動できます。
import { createSocket } from "node:dgram";
const socket = createSocket("udp4");
socket.on("message", (message, remote) => {
console.log(message.toString(), remote.address);
});
socket.bind(41234);
ただし、clusterの利用例で使われるreusePortはOSによって挙動が異なります。Bun 1.2の公式記事は、Linuxでは有効でもmacOSとWindowsでは期待どおりにHTTP接続が分散されないと注意しています。開発PCで起動できることと、本番で意図した負荷分散になることは分けて検証してください。
V8関連APIには限界がある
BunはJavaScriptCoreを使用し、Node.jsはV8を使用します。Bun 1.2はV8の公開C++ APIとの互換層や、node:v8のヒープスナップショット機能を追加しましたが、すべてのV8依存パッケージを動かせるわけではありません。
特にネイティブアドオンを含む依存関係では、次を確認します。
- 対象パッケージのBun対応状況
- 実際に使うOS・CPUでのインストール
- 起動だけでなく主要機能のテスト
- エラー名や終了コードなど運用監視に使う挙動
互換性ページは更新されるため、導入時点の公式一覧を確認するのが確実です。
Bun.s3でオブジェクトストレージを扱う
Bun.s3はS3互換オブジェクトストレージを扱う組み込みAPIです。ファイル参照はBlobと似たインターフェースを持ち、読み込み、書き込み、削除、ストリーム、署名付きURLを扱えます。
import { s3 } from "bun";
const object = s3.file("reports/summary.txt");
await object.write("completed");
const text = await object.text();
console.log(text);
既定クライアントはAWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEYなどの環境変数を利用できます。コードへ認証情報を直接書かず、開発・CI・本番それぞれの秘密情報管理へ渡します。
ブラウザから直接アップロードさせる場合は署名付きURLも生成できます。署名の有効期限、許可する操作、オブジェクトキーを必要最小限にし、公開ACLを安易に付けないことが重要です。S3互換サービスごとに対応機能が異なる可能性もあるため、AWS S3と同じ挙動だと決めつけず試験します。
Bun.sqlでPostgresへ接続する
Bun 1.2は組み込みPostgresクライアントBun.sqlを追加しました。タグ付きテンプレートリテラルで値を渡すと、値をSQL文字列へ手作業で連結せず、パラメータとして扱えます。
import { sql } from "bun";
const minimumAge = 18;
const users = await sql`
SELECT id, name
FROM users
WHERE age >= ${minimumAge}
ORDER BY id
LIMIT 20
`;
console.log(users);
パラメータ化はSQLインジェクション対策の基本ですが、テーブル名や並び順などSQL構文自体をユーザー入力から組み立ててよいわけではありません。また、本番導入では接続数、タイムアウト、トランザクション、TLS、マイグレーション方法を確認します。
Bunの後続バージョンではAPIが拡張されています。1.2の記事に現在の全機能を混ぜると時系列が分かりにくくなるため、実装時は使用中バージョンのSQLリファレンスを参照してください。
bun.lockがテキスト形式になった
Bunは従来、バイナリ形式のbun.lockbを使っていました。Bun 1.2では、JSONC形式のbun.lockが新規プロジェクトの既定になりました。テキストなので、Pull Request上で依存関係の変更を読み、通常の差分としてレビューできます。
既存プロジェクトは次のコマンドでテキスト形式へ移行できます。
bun install --save-text-lockfile
移行後は、依存関係が意図せず更新されていないか差分を確認し、CIでも同じBunバージョンを使います。ロックファイルを削除して作り直す操作は解決結果を変える可能性があるため、単なる形式変換として無条件に行わないでください。
既存Node.jsアプリへ導入する手順
全面移行より、検証範囲を小さく始めるほうが問題を切り分けやすくなります。
bun installだけを試し、ロックファイルとinstall scriptを確認する- ユニットテストをBunで動かす
- CLIやバッチなど、影響範囲の狭い処理を移す
- HTTP、DB、オブジェクトストレージなど外部I/Oを結合テストする
- 本番と同じOS・CPU・環境変数で検証する
- Node.jsへ戻す条件と手順を残して段階的に切り替える
パフォーマンスは公式ベンチマークだけで判断せず、自分のアプリで測定します。処理時間だけでなく、エラー率、メモリ、起動時間、依存パッケージの安定性、監視ツールとの互換性も比較対象です。
採用判断
Bun 1.2は、Node.js互換性を強化しながら、S3やPostgresなどサーバー開発で頻出する機能をランタイムへ統合したリリースです。設定や依存パッケージを減らせる可能性がある一方、ランタイム固有APIを使うほどNode.jsへの移植性は下がります。
既存のNode.js互換コードを動かすのか、Bun.s3やBun.sqlを積極的に使うのかを最初に決めてください。前者は移行しやすさ、後者はBunによる統合を優先する設計です。どちらを選ぶ場合も、Bunのバージョン固定と実環境でのテストが採用判断の中心になります。
また、1.2は過去のリリースです。新規導入時は最新安定版を選び、この記事を変更の背景を理解する資料として使ってください。後続版で追加されたAPIや既定値を1.2の仕様と思い込まず、実行中のbun --versionと対応する公式リファレンスを基準にします。