Bun
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
スター履歴
データ取得日時: 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");
},
},
});