Bun vs Deno
Bun(Zigランタイム、約3倍高速)とDeno(Rustランタイム、TypeScriptファースト) — モダンなNode.js代替ランタイムの比較。パフォーマンス、互換性、エコシステム。
Rustコアの、オールインワンで高速なJS/TSランタイム
2009年から続くエンタープライズ級JavaScriptランタイムの標準
明確な単一の答えはないが、明確な判断の枠組みはある。純粋なJS/TS依存の新規HTTPサービスを書いていて、速度と統合されたツールチェーンを求めているなら、Bun 1.4はもはや真剣に検討すべき選択肢だ——Node 26.3.0互換で1,517件のテストに合格した事実がそれを裏付けている。しかし、native N-APIモジュール(sharp、native bcrypt、一部のDBドライバなど)に依存している場合、あるいは長期運用のエンタープライズSSR/APIシステムを運用している場合は、Node 24 LTSの30か月の公式サポート保証と巨大なnativeモジュールエコシステムの方が依然として安全なデフォルトだ。同一プロジェクト内で「Bun=ツールチェーン(install/test/build)、Node=本番ランタイム」というハイブリッド構成も正当かつ次第に一般化しているアプローチであり、段階的な採用によりリスクを軽減できる。判断は合成的な「req/s」の数値ではなく、自分自身の依存関係リストを`bun install`で実際にテストし、実際の負荷プロファイルに基づいて下すべきだ。
| カテゴリー | Bun 1.4 | Node.js 26 / 24 LTS |
|---|---|---|
| パフォーマンス | 9/10 | 7/10 |
| 学習のしやすさ | 8/10 | 7/10 |
| エコシステム | 6/10 | 10/10 |
| コミュニティ | 6/10 | 10/10 |
| 求人市場 | 5/10 | 10/10 |
| 将来性 | 8/10 | 9/10 |
// Bun 1.4 — HTTP/2対応のネイティブサーバー(Bun.serve)+組み込みSQLクライアント
// bun run server.tsでTypeScriptを直接実行、トランスパイル工程は不要
import { SQL } from "bun";
// Bunの組み込みSQLクライアント:クエリはタグ付きテンプレートとして記述する
const db = new SQL(process.env.DATABASE_URL!);
const server = Bun.serve({
port: 3000,
// Bun v1.4.1以降、Bun.serveはネイティブHTTP/2をサポート
http2: true,
async fetch(req: Request): Promise<Response> {
const url = new URL(req.url);
if (url.pathname === "/api/users" && req.method === "GET") {
const users = await db`SELECT id, name FROM users LIMIT 20`;
return Response.json(users);
}
if (url.pathname === "/api/upload" && req.method === "POST") {
const body = await req.formData();
const file = body.get("file") as File;
// Bun.writeはディスクへストリーム書き込みするため、追加のバッファコピーは不要
await Bun.write(`./uploads/${file.name}`, file);
return Response.json({ ok: true, size: file.size });
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Bun sunucusu ${server.port} portunda dinliyor (HTTP/2 aktif)`);
// bun installで依存関係をインストール — npm互換のnode_modulesを生成
// $ bun install
// $ bun test
// $ bun build ./server.ts --outdir ./dist --target bun// Node.js 24 LTS — ネイティブhttpモジュール+type-strippingによる直接TS実行
// Type strippingはv23.6.0/v22.18.0以降デフォルト、v25.2.0/v24.12.0以降安定:「erasable syntax」のTSサポートのみ
// node server.ts(24.12+および26.xではフラグなしで実行可能;無効化するには--no-strip-types)
import { createServer } from "node:http";
import { readFile, writeFile } from "node:fs/promises";
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const server = createServer(async (req, res) => {
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
if (url.pathname === "/api/users" && req.method === "GET") {
const result = await pool.query("SELECT id, name FROM users LIMIT 20");
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(result.rows));
return;
}
if (url.pathname === "/api/report" && req.method === "GET") {
// worker_threadsでCPU負荷の高い処理をメインスレッドをブロックせずに実行
const { Worker } = await import("node:worker_threads");
const worker = new Worker("./report-worker.js");
worker.once("message", (report) => {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(report));
});
return;
}
res.writeHead(404);
res.end("Not Found");
});
server.listen(3000, () => {
console.log("Node.js sunucusu 3000 portunda dinliyor");
});
// npm installで依存関係をインストール
// $ npm install
// $ node --test明確な単一の答えはないが、明確な判断の枠組みはある。純粋なJS/TS依存の新規HTTPサービスを書いていて、速度と統合されたツールチェーンを求めているなら、Bun 1.4はもはや真剣に検討すべき選択肢だ——Node 26.3.0互換で1,517件のテストに合格した事実がそれを裏付けている。しかし、native N-APIモジュール(sharp、native bcrypt、一部のDBドライバなど)に依存している場合、あるいは長期運用のエンタープライズSSR/APIシステムを運用している場合は、Node 24 LTSの30か月の公式サポート保証と巨大なnativeモジュールエコシステムの方が依然として安全なデフォルトだ。同一プロジェクト内で「Bun=ツールチェーン(install/test/build)、Node=本番ランタイム」というハイブリッド構成も正当かつ次第に一般化しているアプローチであり、段階的な採用によりリスクを軽減できる。判断は合成的な「req/s」の数値ではなく、自分自身の依存関係リストを`bun install`で実際にテストし、実際の負荷プロファイルに基づいて下すべきだ。
無料相談を受けるほとんどのHTTP API/Webサービスであれば可能——Bun 1.4はNode.js 26.3.0互換性スイートで1,517件の新規テストに合格し、Express/Fastify/Next.jsなどのフレームワークも問題なく動作する。ただし、native N-APIアドオン(sharp、native bcryptなど)に依存している場合や、72時間以上稼働し続ける長寿命プロセスがある場合は、NodeのV8ベースのGC挙動の方が依然として実績がある。端的に言えば、新規サービス+純粋なJS依存ならBunが適しており、既存の/nativeモジュールに依存の大きいシステムならNodeが適している。