AI

Bunの使い方完全ガイド【インストールから応用まで】

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 installyarn 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 addnpm installyarn addbun removenpm uninstallyarn 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には高速なテストランナーが内蔵されています。jestvitestの代わりに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.tsclient.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.jsonworkspacesフィールドを設定することで、複数のサブプロジェクトの依存関係を効率的に扱えます。

例えば、以下のようなディレクトリ構造を持つ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.jsonscripts

Bunはpackage.jsonscriptsを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 installbun 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開発を体験してください。


参考文献

広告

-AI