Bunの使い方完全ガイド【インストールから応用まで】
JavaScript開発の現場では、プロジェクトの立ち上げからデプロイまで、多くのツールを使い分けるのが一般的です。Node.jsでランタイムを動かし、npmやYarnでパッケージを管理し、WebpackやRollupでバンドルし、Jestでテストを実行する。これらのツール群はそれぞれ強力ですが、設定の複雑さや、ツール間の連携によるオーバーヘッドが、開発速度を鈍らせる原因となることもありました。
もし、これらの機能をたった一つのツールで、しかも圧倒的な速度で実現できるとしたらどうでしょうか。設定の手間は最小限に抑えられ、開発サーバーの起動は瞬時に完了し、ビルドやテストも驚くほど高速になります。これが、私たちが今日紹介する「Bun」の世界です。Bunは、これまでのJavaScript開発の常識を覆し、あなたの開発ワークフローを劇的に加速させる可能性を秘めています。
Bunとは
Bunは、JavaScriptとTypeScriptアプリケーションのためのオールインワンツールキットです。たった一つのbunという実行ファイルで提供されます。その中核をなすのは、Node.jsのドロップイン代替として設計された高速なJavaScriptランタイムです。Zig言語で書かれ、JavaScriptCoreを基盤としているため、起動時間の短縮とメモリ使用量の削減を大きく実現しています。
なぜBunが誕生したのでしょうか。既存のJavaScriptエコシステムは非常に成熟していますが、ツールチェーンの複雑さやパフォーマンスのボトルネックが課題でした。Bunはこれらの課題を解決するため、ランタイム、パッケージマネージャー、バンドラー、テストランナーといった機能を統合し、これらを高速化することを目指して開発されました。Node.jsプロジェクトとの高い互換性を持ちながら、3〜5倍の速度向上を謳っています。
インストール方法
Bunのインストールは非常に簡単です。以下のコマンドを使って、あなたのOSにBunを導入できます。
macOS / Linux (推奨)
ターミナルを開き、以下のコマンドを実行します。
curl -fsSL https://bun.com/install | bash
このスクリプトは、Bunの実行ファイルをダウンロードし、適切なパスに配置します。
Windows
PowerShellで以下のコマンドを実行します。
powershell -c "irm bun.sh/install.ps1 | iex"
その他のインストール方法
npm、Homebrew、Docker経由でもインストールが可能です。
npmでインストールする場合:
npm install -g bun
Homebrewでインストールする場合 (macOS/Linux):
brew tap oven-sh/bun
brew install bun
Dockerでインストールする場合:
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
Bunのアップグレード
Bunのバージョンを最新に保つには、以下のコマンドを実行します。
bun upgrade
最新のカナリアビルド(開発版)にアップグレードする場合は、--canaryオプションを使用します。
bun upgrade --canary
基本的な使い方
Bunは、ランタイム、パッケージマネージャー、テストランナーなど、複数の顔を持ちます。ここでは、開発で最低限必要となる基本的なコマンドを5つ紹介します。
1. JavaScript/TypeScriptコードの実行
Bunランタイムを使って、JavaScriptやTypeScriptファイルを直接実行できます。JSXもサポートされています。
# index.tsxというファイルをBunで実行する
bun run index.tsx
例えば、hello.ts というファイルに以下のコードを記述します。
// hello.ts
console.log("Hello, Bun!");
const add = (a: number, b: number): number => a + b;
console.log(`1 + 2 = ${add(1, 2)}`);
これを実行するには、bun runコマンドを使います。
bun run hello.ts
これにより、TypeScriptのコンパイルなしに直接実行され、結果が表示されます。
2. パッケージのインストール
BunはNode.js互換の高速なパッケージマネージャーとしても機能します。npm installやyarn installの代わりにbun installを使えます。
# プロジェクトの依存関係をインストールする
bun install
package.jsonがあるディレクトリでこのコマンドを実行すると、依存関係が高速にインストールされます。
3. パッケージの追加・削除
新しいパッケージをプロジェクトに追加する場合や、不要なパッケージを削除する場合も簡単です。
# reactとreact-domを追加する
bun add react react-dom
# lodashを開発依存として追加する
bun add -D lodash
# expressを削除する
bun remove express
bun addはnpm installやyarn add、bun removeはnpm uninstallやyarn removeに相当します。
4. package.jsonスクリプトの実行
package.jsonに定義されたスクリプトを実行することも可能です。
# package.jsonの"start"スクリプトを実行する
bun run start
例えば、package.jsonに以下のようなスクリプトがある場合です。
// package.json
{
"name": "my-bun-app",
"version": "1.0.0",
"scripts": {
"start": "bun run src/index.ts",
"dev": "bun --watch src/index.ts",
"test": "bun test"
},
"dependencies": {
"express": "^4.18.2"
}
}
このstartスクリプトを実行するには、bun run startと入力します。
5. テストの実行
Bunには高速なテストランナーが内蔵されています。jestやvitestの代わりにbun testを使えます。
# プロジェクト内のテストを実行する
bun test
例えば、sum.test.tsというファイルに以下のテストコードを記述します。
// sum.test.ts
import { expect, test } from "bun:test";
const sum = (a: number, b: number) => a + b;
test("sum adds two numbers", () => {
expect(sum(1, 2)).toBe(3);
expect(sum(5, 7)).toBe(12);
});
このテストを実行するには、bun testコマンドを使います。
bun test
Bunはテストファイルを自動的に検出し、高速に実行します。
便利な使い方・応用例 3選
Bunの真価は、そのオールインワン機能と速度を活かした開発ワークフローの改善にあります。ここでは、実際の開発シーンで役立つ応用例を3つ紹介します。
1. フルスタック開発サーバーの統合とホットリロード
Bunは、バックエンドとフロントエンドを統合した開発サーバーを高速に起動できます。bun --watchコマンドを使えば、ファイルの変更を監視し、自動的にリロードするホットリロード機能も利用可能です。これにより、開発体験が大幅に向上します。
例えば、server.tsとclient.tsというファイルがある場合です。
// server.ts (バックエンドの例)
import { serve } from "bun";
serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/") {
return new Response("Hello from Bun Server!", {
headers: { "Content-Type": "text/plain" },
});
}
return new Response("Not Found", { status: 404 });
},
});
console.log("Bun server listening on http://localhost:3000");
// client.ts (フロントエンドの例)
// このファイルは、例えばHTMLファイルから読み込まれることを想定
document.addEventListener("DOMContentLoaded", async () => {
const response = await fetch("/");
const text = await response.text();
const div = document.createElement("div");
div.textContent = `Client received: ${text}`;
document.body.appendChild(div);
console.log("Client script loaded.");
});
これらを監視しながら開発するには、package.jsonのスクリプトを活用します。
// package.json
{
"name": "fullstack-bun-app",
"version": "1.0.0",
"scripts": {
"dev": "bun --watch server.ts"
},
"dependencies": {
"bun": "latest"
}
}
そして、以下のコマンドを実行します。
bun run dev
server.tsファイルを変更すると、Bunサーバーは自動的に再起動され、変更が即座に反映されます。これは、特にNode.jsベースのアプリケーション開発において、開発サイクルの短縮に大きく貢献します。
2. bunxを活用したワンショットスクリプトとCI/CDでの活用
bunxは、npmのnpxと同様に、一時的にパッケージを実行するためのコマンドです。これにより、グローバルインストールせずにツールを試したり、CI/CD環境で特定のツールを安全に実行したりできます。
例えば、cowsayというパッケージを一時的に使いたい場合です。
bunx cowsay 'Hello from Bunx!'
このコマンドは、cowsayパッケージをダウンロードし、実行し、その後クリーンアップします。
CI/CD環境では、Bunのパッケージマネージャーの信頼性が重要になります。bun install --frozen-lockfileを使用することで、bun.lockbファイルに基づいた厳密な依存関係のインストールが保証されます。
# CI/CD環境で依存関係をインストールし、ロックファイルを固定する
bun install --frozen-lockfile
これにより、ビルドの一貫性が保たれ、予期せぬ依存関係の変更による問題を防げます。また、bunxを使って特定のビルドツールやテストツールを毎回最新版で実行することも可能です。
3. Monorepoでのワークスペース管理
Bunは、Monorepo(複数の関連プロジェクトを一つのリポジトリで管理する方式)でのワークスペース管理もサポートしています。package.jsonのworkspacesフィールドを設定することで、複数のサブプロジェクトの依存関係を効率的に扱えます。
例えば、以下のようなディレクトリ構造を持つMonorepoを考えます。
my-monorepo/
├── package.json
├── packages/
│ ├── api/
│ │ └── package.json
│ └── web/
│ └── package.json
└── bun.lockb
my-monorepo/package.jsonにワークスペースを定義します。
// my-monorepo/package.json
{
"name": "my-monorepo",
"version": "1.0.0",
"private": true,
"workspaces": [
"packages/api",
"packages/web"
],
"scripts": {
"dev:api": "bun run --cwd packages/api dev",
"dev:web": "bun run --cwd packages/web dev"
}
}
各サブプロジェクトのpackage.jsonには、そのプロジェクト固有の依存関係とスクリプトを記述します。
// my-monorepo/packages/api/package.json
{
"name": "api",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
},
"scripts": {
"dev": "bun --watch index.ts"
}
}
// my-monorepo/packages/web/package.json
{
"name": "web",
"version": "1.0.0",
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"scripts": {
"dev": "bun --watch index.tsx"
}
}
Monorepoのルートディレクトリでbun installを実行すると、すべてのワークスペースの依存関係がまとめてインストールされ、bun.lockbファイルが生成されます。
# ルートで全てのワークスペースの依存関係をインストール
bun install
これにより、依存関係の重複を避け、インストールプロセスを高速化できます。また、ルートのpackage.jsonから各ワークスペースのスクリプトを実行することも容易になります。
他ツールとの組み合わせ
BunはNode.jsとの高い互換性を持つため、既存のJavaScriptエコシステムと非常に相性が良いです。多くの人気ツールやフレームワークと組み合わせることで、その真価を発揮します。
フレームワークとの連携
- Next.js, React, Vue, SvelteKit: Bunはこれらのフレームワークのアプリケーションを実行するランタイムとして機能します。例えば、
bun create next-appでプロジェクトを作成し、bun installで依存関係をインストール、bun run devで開発サーバーを起動するといった使い方が可能です。Bunの高速なランタイムとバンドラーが、開発サーバーの起動やビルド時間を短縮します。 - Hono, Elysia: これらはBunランタイムに最適化された軽量なWebフレームワークです。Bunのパフォーマンスを最大限に引き出し、非常に高速なAPIサーバーを構築できます。
データベースツールとの連携
- Prisma, Drizzle ORM: これらのORM(Object-Relational Mapper)は、データベース操作をTypeScript/JavaScriptで行うための強力なツールです。BunはNode.jsのAPI互換性を提供するため、PrismaクライアントやDrizzle ORMをBunアプリケーション内で問題なく利用できます。マイグレーションの実行やクエリの生成など、Bunの高速なランタイムが開発ワークフローをサポートします。
CI/CDツールとの連携
GitHub Actions, GitLab CI, CircleCI: BunはCI/CDパイプラインにも簡単に組み込めます。公式のDockerイメージが提供されており、これを使用すれば環境構築の手間が省けます。または、GitHub Actions MarketplaceにはBunのセットアップアクションも存在します。前述の
bun install --frozen-lockfileを活用することで、安定したビルド環境を構築できます。# GitHub Actionsの例 name: Bun CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 # Bunをセットアップ with: bun-version: latest - run: bun install --frozen-lockfile # 依存関係をインストール - run: bun test # テストを実行 - run: bun run build # ビルドを実行
エディタ・開発環境
- VS Code: BunはTypeScriptをネイティブサポートしているため、VS Codeでの開発体験は非常にスムーズです。TypeScriptの型チェック、コード補完、リファクタリングなどが問題なく機能します。また、BunのデバッガもVS Codeと連携して利用できます。
よくある設定・カスタマイズ
Bunは多くの機能をデフォルトで提供しますが、特定のニーズに合わせてカスタマイズすることも可能です。
bunfig.tomlによる設定
Bunは、プロジェクトのルートに配置されるbunfig.tomlファイルを使って、様々な設定をカスタマイズできます。これは、環境変数、ローダー、プラグイン、モジュール解決などの挙動を制御するために使われます。
例えば、特定の拡張子を持つファイルをカスタムローダーで処理したい場合です。
# bunfig.toml
[loaders]
".my-custom-file" = "json" # .my-custom-fileをJSONとして扱う
また、環境変数を設定することもできます。
# bunfig.toml
[global]
env = { MY_API_KEY = "your_secret_key" }
これにより、process.env.MY_API_KEYを通じて値にアクセスできるようになります。
package.jsonのscripts
Bunはpackage.jsonのscriptsをNode.jsと同様に実行できます。これにより、既存のプロジェクトのスクリプトをそのままBunで実行したり、Bun独自の高速なスクリプトを定義したりできます。
// package.json
{
"name": "my-bun-project",
"version": "1.0.0",
"scripts": {
"start": "bun run src/server.ts",
"build": "bun build src/index.ts --outdir ./dist",
"test:unit": "bun test --filter 'unit/'",
"lint": "bunx eslint ."
}
}
これらのスクリプトは、bun run startのように実行できます。bunxを使うことで、依存関係としてインストールされたeslintなどのツールも手軽に実行可能です。
Bunバージョンの固定
本番環境やCI/CD環境では、Bunのバージョンを固定することが重要です。これにより、予期せぬ挙動の変化を防ぎ、ビルドの再現性を保証できます。
.bun-versionファイル: プロジェクトのルートに.bun-versionファイルを作成し、使用したいBunのバージョン番号を記述します(例:1.0.0)。Bunは、このファイルが存在する場合、指定されたバージョンで実行を試みます。- CI/CD設定: GitHub Actionsの
oven-sh/setup-bun@v1アクションのように、CI/CDツールでBunのバージョンを明示的に指定します。
# .bun-version
1.0.0
これにより、プロジェクトに関わる開発者全員が同じBunバージョンを使用し、環境による差異を最小限に抑えられます。
今日からできる実行プラン
Bunの導入は、小さなステップから始めることができます。以下の3ステップで、あなたの開発ワークフローにBunを取り入れてみましょう。
ステップ1: Bunのインストールと基本コマンドの試用
まずは、あなたの開発環境にBunをインストールすることから始めます。
curl -fsSL https://bun.com/install | bash # macOS/Linuxの場合
# または powershell -c "irm bun.sh/install.ps1 | iex" # Windowsの場合
インストールが完了したら、簡単なJavaScriptファイルを作成し、Bunで実行してみてください。
# test.jsファイルを作成
echo 'console.log("Bun works!");' > test.js
# Bunで実行
bun run test.js
次に、bun installとbun testも試してみましょう。これにより、Bunの基本的な機能が動作することを確認できます。
ステップ2: 既存のプロジェクトでパッケージマネージャーとして試す
次に、既存のNode.jsプロジェクトでBunをパッケージマネージャーとして試してみます。package.jsonがあるディレクトリに移動し、node_modulesを削除してからbun installを実行してみてください。
cd your-existing-nodejs-project
rm -rf node_modules # 既存のnode_modulesを削除
bun install # Bunで依存関係をインストール
多くの場合、bun installはnpmやYarnよりもはるかに高速に完了します。その後、bun run <script_name>で既存のpackage.jsonスクリプトを実行し、問題なく動作することを確認しましょう。これにより、Bunの高速なパッケージ管理の恩恵を感じられるはずです。
ステップ3: 新規プロジェクトでBunをフル活用する
Bunの恩恵を最大限に受けるためには、新規プロジェクトでBunを最初から活用するのが最も効果的です。bun initコマンドを使えば、基本的なBunプロジェクトを素早く作成できます。
bun init my-new-bun-app
cd my-new-bun-app
このコマンドは、package.jsonと基本的なindex.tsファイルを作成します。ここから、先ほど紹介した応用例を参考に、Bunのランタイム、バンドラー、テストランナーといった機能を統合的に使いこなす開発を始めてみましょう。例えば、bun --watchを使った開発サーバーの構築や、bun testによる高速なテストサイクルなどが実現できます。
Bunはまだ進化の途中にありますが、その可能性は計り知れません。今日からBunをあなたの開発ツールキットに加え、より高速で快適なJavaScript開発を体験してください。
参考文献
- 10 Bun Workflows That Turbocharge Full-Stack Dev
- The Practical Guide to Bun in Production
- Bun Documentation
- Bun GitHub Repository