Bun

JavaScriptTypeScriptランタイムパッケージマネージャーバンドラーテストランナーZig

GitHub概要

oven-sh/bun

Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one

ホームページ:https://bun.com
スター79,643
ウォッチ572
フォーク3,253
作成日:2021年4月14日
言語:Zig
ライセンス:Other

トピックス

bunbundlerjavascriptjavascriptcorejsxnodejsnpmreacttranspilertypescriptzigziglang

スター履歴

oven-sh/bun Star History
データ取得日時: 2025/8/13 01:43

JavaScriptランタイム&パッケージマネージャー

Bun

概要

Bunは、Zigで書かれた超高速オールインワンJavaScriptツールキットです。2025年現在、JavaScriptランタイム、パッケージマネージャー、バンドラー、テストランナーを単一の実行ファイルに統合し、Node.jsのドロップイン代替として設計されています。JavaScriptCoreエンジンを採用し、起動時間とメモリ使用量を劇的に削減。npmと比較して10-100倍の速度向上を実現しています。

詳細

主な特徴

  • オールインワンツールキット: ランタイム、パッケージマネージャー、バンドラー、テストランナーを統合
  • 超高速パフォーマンス: Zigで書かれ、JavaScriptCoreエンジンを採用
  • TypeScript標準サポート: .ts.tsx.jsxファイルを直接実行可能
  • Node.js互換性: 既存のNode.jsプロジェクトでそのまま使用可能
  • Web標準API実装: fetch、WebSocket、ReadableStreamなどをネイティブサポート
  • スマートキャッシング: グローバルキャッシュによる高速インストール

パッケージマネージャー機能

  • 高速インストール: bun installはnpmの20-100倍高速
  • npm互換: package.jsonとnode_modulesを使用し、既存プロジェクトで動作
  • ワークスペース対応: モノレポサポートを標準搭載
  • セキュリティ機能: postinstallスクリプトをデフォルトで実行しない
  • 複数ソース対応: npm、Git、HTTP、tarballからのパッケージ取得

ランタイム機能

  • 高速起動: Node.jsの4倍高速な起動時間
  • 低メモリ使用: JavaScriptCoreによる効率的なメモリ管理
  • ESモジュール優先: ESMとCommonJS両方をサポート
  • ネイティブTypeScript: トランスパイル不要で直接実行
  • 組み込みテストランナー: Jest互換のテストランナーを内蔵

バンドラー機能

  • 高速ビルド: webpackやesbuildを上回る速度
  • Tree-shaking: 不要なコードの自動除去
  • 最適化: minificationとコード分割を標準サポート
  • プラグインシステム: カスタムビルドプロセスの拡張

メリット・デメリット

メリット

  • 圧倒的な速度: パッケージインストール、スクリプト実行、ビルドすべてが高速
  • 統合環境: 複数ツールの設定・管理が不要
  • TypeScript標準対応: 設定なしでTypeScriptが使える
  • Node.js互換: 既存プロジェクトの移行が容易
  • 開発体験の向上: 高速な起動とホットリロード
  • ディスク効率: ハードリンクによるストレージ節約

デメリット

  • 比較的新しい: 2023年リリースで、エコシステムが成熟途上
  • Node.js API完全互換性: 一部のNode.js APIが未実装
  • Windows対応: Windows版は実験的サポート段階
  • デバッグツール: Node.jsと比較してツールが限定的
  • エンタープライズ採用: 本番環境での実績がまだ少ない

参考ページ

書き方の例

パッケージ管理

# プロジェクトの初期化
bun init

# 依存関係のインストール(超高速)
bun install

# パッケージの追加
bun add express
bun add -d @types/express

# グローバルインストール
bun add -g typescript

# パッケージの削除
bun remove express

# スクリプトの実行
bun run dev
bun run build

# package.jsonスクリプトなしで直接実行
bun run index.ts

TypeScriptの直接実行

// server.ts - TypeScriptファイルを直接実行可能
import { serve } from "bun";

serve({
  port: 3000,
  fetch(req) {
    return new Response("Hello from Bun!");
  },
});

// 実行コマンド
// bun run server.ts

高速なHTTPサーバー

// Bunの組み込みHTTPサーバー
Bun.serve({
  port: 3000,
  fetch(request) {
    const url = new URL(request.url);
    
    if (url.pathname === "/") {
      return new Response("Welcome to Bun!");
    }
    
    if (url.pathname === "/json") {
      return Response.json({ message: "Hello", timestamp: Date.now() });
    }
    
    return new Response("Not Found", { status: 404 });
  },
});

console.log("Server running at http://localhost:3000");

テストの実行

// math.test.ts
import { expect, test, describe } from "bun:test";

describe("Math operations", () => {
  test("addition", () => {
    expect(2 + 2).toBe(4);
  });
  
  test("async test", async () => {
    const result = await Promise.resolve(42);
    expect(result).toBe(42);
  });
});

// 実行コマンド
// bun test

ファイル操作

// Bunの高速ファイルAPI
import { file, write } from "bun";

// ファイル読み込み
const configFile = file("config.json");
const config = await configFile.json();

// ファイル書き込み
await write("output.txt", "Hello from Bun!");

// ストリーミング
const stream = file("large-file.txt").stream();
for await (const chunk of stream) {
  console.log(chunk);
}

バンドリング

// build.js
await Bun.build({
  entrypoints: ["./src/index.ts"],
  outdir: "./dist",
  target: "browser",
  minify: true,
  splitting: true,
  sourcemap: "external",
});

// 実行コマンド
// bun run build.js

環境変数とプロセス管理

// .env.localファイルを自動的に読み込み
console.log(process.env.DATABASE_URL);

// Bunのグローバルオブジェクト
console.log(Bun.version);
console.log(Bun.revision);

// シェルコマンドの実行
import { $ } from "bun";

const result = await $`ls -la`.text();
console.log(result);

// 並列実行
const [npm, yarn, pnpm] = await Promise.all([
  $`npm --version`.text(),
  $`yarn --version`.text(),
  $`pnpm --version`.text(),
]);

WebSocketサーバー

Bun.serve({
  port: 8080,
  fetch(req, server) {
    // WebSocketへのアップグレード
    if (server.upgrade(req)) {
      return; // アップグレード成功
    }
    return new Response("Upgrade failed", { status: 500 });
  },
  websocket: {
    open(ws) {
      console.log("WebSocket opened");
      ws.send("Welcome!");
    },
    message(ws, message) {
      console.log("Received:", message);
      ws.send(`Echo: ${message}`);
    },
    close(ws) {
      console.log("WebSocket closed");
    },
  },
});