はじめに
正直なところ、最初は「また新しいJavaScriptランタイムか」と思っていました。
Node.js、Deno、そして今度はBun。JavaScript界隈って、次から次へと新しいツールが出てきますよね。でも、実際にBunを使ってみて、これは「また一つ増えた」という話じゃないなと感じています。
BunはGitHubで84,000スター以上を獲得している、今最も注目されているJavaScriptランタイムです。「Node.jsのドロップイン・リプレースメント」を謳っていて、既存のNode.jsプロジェクトにほぼ変更なしで導入できます。
そして何より、速い。これが本当に速いんですよ。
Bunとは
Bunは、JavaScript/TypeScriptアプリケーション向けのオールインワンツールキットです。単一の実行可能ファイルとして提供され、ランタイム・パッケージマネージャー・テストランナー・バンドラーがすべて含まれています。
Zigという低レベル言語で書かれていて、内部ではSafariで使われているJavaScriptCoreエンジンを採用しています。Node.jsが採用しているV8エンジンとは異なるアプローチで、起動時間とメモリ使用量が大幅に削減されています。
公式サイト: https://bun.sh GitHub: https://github.com/oven-sh/bun
特徴・メリット
1. 驚異的な起動速度
これ、意外とインパクト大きいんですよ。
開発中って何度もスクリプトを実行しますよね。Node.jsだと「npm run」のたびに微妙な待ち時間があるじゃないですか。Bunはこの起動時間が圧倒的に短い。
# 起動時間の比較(目安)
node app.js # ~40ms
bun app.js # ~5ms
体感的に「サクッ」と動く。30代になって思うのは、こういう小さなストレスの積み重ねって馬鹿にならないということ。
2. TypeScript/JSXがネイティブ対応
個人的にはこれが一番の推しポイントです。
// index.ts - そのまま実行可能
interface User {
id: number;
name: string;
}
const user: User = { id: 1, name: "easegis" };
console.log(user);
bun index.ts
# トランスパイル設定不要で即実行
tsconfigやbabelの設定なしで、いきなりTypeScriptが動く。この手軽さはNode.jsにはない。
3. オールインワンツールキット
Bunは以下の機能をすべて内蔵しています:
| 機能 | コマンド | 相当するNode.jsツール |
|---|---|---|
| ランタイム | bun run |
node |
| パッケージマネージャー | bun install |
npm, yarn, pnpm |
| テストランナー | bun test |
jest, vitest |
| バンドラー | bun build |
webpack, esbuild |
これだけのツールが一つのバイナリに収まっています。devDependenciesがスッキリするのはありがたい。
4. npm互換パッケージマネージャー
bun installはnpmの5倍以上高速と言われています。しかもnpm、yarn、pnpmのlockファイルを読み込めるので、既存プロジェクトにそのまま導入できます。
bun install
# node_modulesの生成が爆速
5. Node.js互換性
既存のNode.jsプロジェクトがほぼそのまま動きます。ExpressやNext.jsなど、主要なフレームワークに対応済みです。
インストール方法
各OSで簡単にインストールできます。
macOS / Linux
curl -fsSL https://bun.sh/install | bash
macOS (Homebrew)
brew install oven-sh/bun/bun
Windows
powershell -c "irm bun.sh/install.ps1 | iex"
npmからのインストール
npm install -g bun
バージョン確認
bun --version
# 1.x.x
アップグレード
bun upgrade
基本的な使い方
プロジェクトの初期化
bun init
package.jsonとエントリーポイントが自動生成されます。
スクリプトの実行
# TypeScriptファイルを直接実行
bun run index.ts
# package.jsonのscriptsを実行
bun run dev
# 省略形(runを省略可能)
bun dev
パッケージのインストール
# 依存関係のインストール
bun install
# パッケージの追加
bun add express
# devDependenciesに追加
bun add -d typescript
# グローバルインストール
bun add -g typescript
HTTPサーバーの作成
Bun標準のHTTPサーバーはめちゃくちゃシンプルです。
// server.ts
const server = Bun.serve({
port: 3000,
fetch(req) {
return new Response("Hello World!");
},
});
console.log(`Server running at http://localhost:${server.port}`);
bun server.ts
# Server running at http://localhost:3000
テストの実行
Jest互換のテストランナーが内蔵されています。
// math.test.ts
import { describe, test, expect } from "bun:test";
describe("math", () => {
test("1 + 1 = 2", () => {
expect(1 + 1).toBe(2);
});
});
bun test
設定ファイル不要で、いきなりテストが動きます。時短になりますね。
実践的なユースケース
1. 開発スクリプトの高速化
// package.json
{
"scripts": {
"dev": "bun --watch src/index.ts",
"build": "bun build ./src/index.ts --outdir ./dist",
"test": "bun test"
}
}
--watchフラグで、ファイル変更時に自動リロードされます。
2. 既存Node.jsプロジェクトへの導入
cd existing-node-project
# lockファイルはそのまま使える
bun install
# 実行
bun run dev
コスパ的にこれが一番効いてきます。既存プロジェクトに無理なく導入できるので、移行コストが低い。
3. APIサーバーの構築
// api.ts
const server = Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/api/users" && req.method === "GET") {
return Response.json([
{ id: 1, name: "User 1" },
{ id: 2, name: "User 2" },
]);
}
if (url.pathname === "/api/users" && req.method === "POST") {
const body = await req.json();
return Response.json({ id: 3, ...body }, { status: 201 });
}
return new Response("Not Found", { status: 404 });
},
});
Expressなしでも、これくらいのAPIならサクッと書けます。
4. スクリプト自動化
// scripts/migrate.ts
import { $ } from "bun";
// シェルコマンドの実行
await $`echo "Running migrations..."`;
await $`prisma migrate dev`;
await $`echo "Done!"`;
Bunの$テンプレートリテラルを使うと、シェルスクリプトの代替として使えます。
Denoとの違い
「DenoとBunって何が違うの?」という質問をよく受けます。
| 項目 | Bun | Deno |
|---|---|---|
| Node.js互換性 | 高い(ドロップイン) | 中程度(互換レイヤー) |
| パッケージ管理 | npm互換 | URL import / npm対応 |
| 開発元 | Oven社 | Deno Land社 |
| エンジン | JavaScriptCore | V8 |
| 重視点 | 速度・互換性 | セキュリティ・標準準拠 |
個人的には、既存Node.jsプロジェクトの高速化ならBun、新規プロジェクトでセキュリティ重視ならDenoという使い分けがいいと思います。
注意点
いいことばかり書いてきましたが、注意点もあります。
1. まだ発展途上
バージョン1.0がリリースされたのは2023年9月です。安定はしてきていますが、エッジケースで問題が出る可能性はあります。
2. 一部のNode.jsモジュールは非対応
ネイティブモジュールなど、一部のnpmパッケージは動かない場合があります。事前に確認が必要です。
3. 本番運用は慎重に
個人開発や開発環境では問題なく使えますが、本番環境への導入は慎重に。まずは開発ツールとして使い始めるのがおすすめです。
まとめ
正直なところ、BunがNode.jsを完全に置き換えるかはまだわかりません。でも、以下の条件に当てはまるなら、試してみる価値は間違いなくあります:
- 開発環境の起動速度を上げたい
- TypeScriptを設定なしで使いたい
- npm installを高速化したい
- ツールチェーンをシンプルにしたい
- 新しい技術を試してみたい
個人的には、まず開発環境でBunを使い始めて、問題なければ本番にも展開という流れがおすすめです。QOL上がること間違いなしなので、まずはインストールして触ってみてください。
公式サイト: https://bun.sh GitHub: https://github.com/oven-sh/bun ドキュメント: https://bun.sh/docs