2月23日、BunチームはBun v1.2.3をリリースした。
今回のリリースは、サーバーサイド機能の充実、Node.js互換性の向上、WebAssemblyの高速起動など、多岐にわたる改善が盛り込まれたアップデートである。

以下に、今回のリリースにおける変更点をポイントを絞って紹介する。
フロントエンド開発環境の改善
Bunは、従来のJavaScriptランタイムとしての機能に加え、.html
ファイルを直接実行できるようになった(そもそもBunは、フロントエンド開発用のサーバーとして開発された経緯があり、原点に立ち戻ったとも言える)。
これにより、ホットリローディングやバンドリングの高速処理が実現され、開発者は設定の手間を省きつつ最新の開発ツールチェーンを活用できるようになった。
シングルページアプリケーションの起動例は以下の通りである。
マルチページアプリケーションの場合は、コマンドに glob パターンを渡すようにする。
Reactはすでにサポートされており、ホット リロードも動作する。Svelte および Vue 用のプラグインは、近日中にリリースされる予定とのこと。
Bun.serve() によるルーティング機能の導入
バックエンドとフロントエンドを同一プロセス上で統合的に実行するため、Bun.serve()に新たなroutes
オプションが追加された。これにより、動的パスパラメータを含むルートの定義が容易となり、以下のような25行程度のデータベース連携型フルスタックアプリケーションが簡潔に実装可能となった。
import { serve, sql } from "bun";
import App from "./myReactSPA.html";
serve({
port: 3000,
routes: {
"/*": App,
"/api/users": {
GET: async () => Response.json(await sql`SELECT * FROM users LIMIT 10`),
POST: async (req) => {
const { name, email } = await req.json();
const [user] =
await sql`INSERT INTO users (name, email) VALUES (${name}, ${email}) RETURNING *`;
return Response.json(user);
},
},
"/api/users/:id": async (req) => {
const { id } = req.params;
const [user] = await sql`SELECT * FROM users WHERE id = ${id} LIMIT 1`;
if (!user) {
return new Response("User not found", { status: 404 });
}
return Response.json(user);
},
},
});
詳細については、Bun.serve() のドキュメントを参照のこと。
Node.js互換性の向上およびBun.SQLの機能拡充
Bun v1.2.3では、Node.jsのBufferおよびNode-APIの互換性が大幅に向上している。具体的な改善点として、以下の項目が挙げられる。
- Buffer.copy()、Buffer.from()など主要なBufferメソッドの挙動がNode.jsと整合するよう改善された。
- NODE_EXTRA_CA_CERTS環境変数から、完全な証明書バンドルを読み込めるようになった。
- SQLクエリにおいて、複数文の実行や準備済みステートメントの無効化、配列サポートの強化が実現された。
- SQLテンプレートリテラルは、関数呼び出しではなくタグ付きテンプレートリテラルとしてのみ利用可能となり、SQLインジェクション対策が強化された。
- PostgreSQLからの数値データが常に文字列として返却される仕様に変更された。
これらの改善により、Bun.SQLはより堅牢かつ柔軟なデータベース操作を実現するツールへと進化した。
WebAssembly実行の高速化とメモリ使用量の低減
JavaScriptCoreのJITコンパイルによる従来のWebAssembly実行方式に代わり、今回のリリースでは新たな_in-place interpreter_(IPInt)がデフォルトで有効化された。これにより、以下の利点が得られる。
- Wasmコードの実行開始までの遅延が低減された。
- 従来のLLIntに比べ、生成されるメタデータが小規模であるためメモリ使用量が削減された。
詳細は[Bun v1.2.3 Bun Blog」を参照していただきたい。