Bun入門 - 次世代JavaScriptランタイム

入門 | 25分 で読める | 2025.01.10

公式ドキュメント

Bunとは

BunはZigで書かれた高速なJavaScriptランタイムです。Node.jsの3倍以上の速度を誇り、パッケージマネージャー、バンドラー、テストランナーを内蔵しています。

実践メモ: BunはmacOS/Linuxで最も安定しています。WindowsユーザーはWSL経由の利用が推奨されます。

インストール

# macOS / Linux
curl -fsSL https://bun.sh/install | bash

# Windows (WSL推奨)
powershell -c "irm bun.sh/install.ps1 | iex"

# バージョン確認
bun --version

基本的な使い方

プロジェクト初期化

# 新規プロジェクト作成
bun init

# 対話形式でセットアップ
# package.json, tsconfig.json, index.ts が生成される

スクリプト実行

ポイント: bun runはTypeScriptを直接実行できるため、トランスパイル設定が不要です

# TypeScriptを直接実行(トランスパイル不要)
bun run index.ts

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

# 省略形
bun dev

パッケージ管理

# パッケージインストール
bun add express
bun add -d typescript @types/node

# 全依存関係のインストール
bun install

# パッケージ削除
bun remove express

# アップデート
bun update

速度比較

# 同じpackage.jsonをインストール
# npm install: 15秒
# bun install: 1秒

HTTPサーバー

Bun組み込みサーバー

// server.ts
const server = Bun.serve({
 port: 3000,
 fetch(request) {
 const url = new URL(request.url);

 if (url.pathname === '/') {
 return new Response('Hello, Bun!');
 }

 if (url.pathname === '/api/users') {
 return Response.json([
 { id: 1, name: 'Alice' },
 { id: 2, name: 'Bob' },
 ]);
 }

 return new Response('Not Found', { status: 404 });
 },
});

console.log(`Server running at http://localhost:${server.port}`);

実践メモ: Bun.serveはWeb標準のRequest/Responseを使用するため、Cloudflare WorkersやDenoとコードを共有しやすいです。

Honoフレームワーク

// Honoは Bun に最適化されたフレームワーク
import { Hono } from 'hono';

const app = new Hono();

app.get('/', (c) => c.text('Hello, Hono!'));

app.get('/api/users/:id', (c) => {
 const id = c.req.param('id');
 return c.json({ id, name: 'User' });
});

app.post('/api/users', async (c) => {
 const body = await c.req.json();
 return c.json({ created: body }, 201);
});

export default app;

ファイル操作

注意: Bun.writeは既存ファイルを上書きします。重要なデータは事前にバックアップを取りましょう。

// ファイル読み込み
const file = Bun.file('data.json');
const content = await file.text();
const json = await file.json();

// ファイル書き込み
await Bun.write('output.txt', 'Hello, World!');
await Bun.write('data.json', JSON.stringify({ key: 'value' }));

// ストリーミング読み込み
const stream = file.stream();
for await (const chunk of stream) {
 console.log(chunk);
}

環境変数

.envファイルは自動的に読み込まれるため、dotenvパッケージは不要です。

// .envファイルは自動的に読み込まれる
// .env
// DATABASE_URL=postgresql://localhost/mydb
// API_KEY=YOUR_API_KEY

// 使用
const dbUrl = Bun.env.DATABASE_URL;
const apiKey = Bun.env.API_KEY;

// process.envも使用可能
const nodeEnv = process.env.NODE_ENV;

テスト実行

テストはbun:testモジュールからインポートし、Jestライクな構文で記述します。

// sum.test.ts
import { expect, test, describe } from 'bun:test';
import { sum } from './sum';

describe('sum', () => {
 test('adds two numbers', () => {
 expect(sum(1, 2)).toBe(3);
 });

 test('handles negative numbers', () => {
 expect(sum(-1, 1)).toBe(0);
 });
});
# テスト実行
bun test

# 特定ファイル
bun test sum.test.ts

# ウォッチモード
bun test --watch

バンドル

# シングルファイルにバンドル
bun build ./index.ts --outdir ./dist

# ミニファイ
bun build ./index.ts --outdir ./dist --minify

# ターゲット指定
bun build ./index.ts --target bun
bun build ./index.ts --target browser
bun build ./index.ts --target node

Node.jsからの移行

注意: 一部のNode.js固有API(node:vm、node:worker_threadsなど)は完全互換ではありません。移行前に依存パッケージの動作確認をしましょう

互換性

// ほとんどのNode.js APIが使用可能
import fs from 'fs';
import path from 'path';
import { createServer } from 'http';

// node_modulesもそのまま使用可能
import express from 'express';

package.json

{
 "name": "my-app",
 "scripts": {
 "dev": "bun run --watch src/index.ts",
 "build": "bun build src/index.ts --outdir dist",
 "test": "bun test",
 "start": "bun run dist/index.js"
 }
}

注意点

// 一部のNode.js固有APIは非対応
// - node:vm(一部)
// - node:worker_threads(Bun.workerを使用)

// Bun固有API
const hash = Bun.hash('data'); // 高速ハッシュ
const result = Bun.spawn(['ls', '-la']); // プロセス実行

ポイント: BunはSQLiteをネイティブサポートしており、外部パッケージなしでデータベース操作が可能です

SQLiteサポート

import { Database } from 'bun:sqlite';

const db = new Database('mydb.sqlite');

// テーブル作成
db.run(`
 CREATE TABLE IF NOT EXISTS users (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 name TEXT NOT NULL,
 email TEXT UNIQUE
 )
`);

// 挿入
const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');
insert.run('Alice', 'alice@example.com');

// クエリ
const query = db.prepare('SELECT * FROM users WHERE id = ?');
const user = query.get(1);
console.log(user);

関連記事

まとめ

Bunは高速なJavaScriptランタイムで、Node.jsの代替として注目されています。パッケージ管理、バンドル、テストが統合されており、開発体験が向上します。

参考リソース

← 一覧に戻る
PR
PR
PR
PR