Bun完全ガイド2025 - 高速JavaScriptランタイムとパッケージマネージャーの実践活用
Bunは高速なJavaScriptランタイムとして注目されています。本記事では、Bunの基本からパフォーマンス最適化、実践的な活用方法まで、Daily Hackでも使用しているBunの魅力を徹底解説します。
Bun 1.2の革新的な新機能を徹底解説。ビルトインPostgresクライアント、S3サポート、3倍高速化したExpress、新しいロックファイル形式など、開発効率を劇的に向上させる最新アップデートを実践例とともに紹介。
Bun 1.2 がリリースされ、JavaScriptランタイムの世界に新たな革命をもたらしました。 本記事では、ビルトイン Postgres クライアント、S3 サポート、パフォーマンスの大幅改善など、 開発者の生産性を劇的に向上させる新機能を実践的なコード例とともに徹底解説します。
Bun 1.2 は、2025 年の JavaScriptエコシステムにおいて最も注目すべきリリースの 1 つです。 開発者の日常的な課題を解決する実用的な機能が満載で、特にデータベース接続やクラウドストレージとの 統合において画期的な改善が実現されています。
革新的な新機能を搭載
コミュニティからのフィードバック収集
主要機能のテスト開始
従来、Node.jsで PostgreSQL を使用する場合、pg
や postgres
などの外部ライブラリが必要でした。
Bun 1.2 では、これらの依存関係なしに、ネイティブで PostgreSQL に接続できるようになりました。
// シンプルなSELECTクエリ
const users = await db`
SELECT id, name, email
FROM users
WHERE active = true
`;
// INSERTクエリ
const newUser = await db`
INSERT INTO users (name, email)
VALUES ('山田太郎', 'yamada@example.com')
RETURNING *
`;
// SQLインジェクション対策済みのパラメータ化クエリ
const userId = 123;
const user = await db`
SELECT * FROM users
WHERE id = ${userId}
`;
// 複数パラメータの使用
const filters = { age: 25, city: '東京' };
const results = await db`
SELECT * FROM users
WHERE age > ${filters.age}
AND city = ${filters.city}
`;
// トランザクション処理
await db.transaction(async (tx) => {
const user = await tx`
INSERT INTO users (name)
VALUES ('新規ユーザー')
RETURNING id
`;
await tx`
INSERT INTO profiles (user_id, bio)
VALUES (${user[0].id}, 'プロフィール')
`;
});
ライブラリ | クエリ実行時間 | メモリ使用量 | 初期化時間 |
---|---|---|---|
Bun.sql | 0.8ms | 12MB | 5ms |
pg (Node.js) | 2.1ms | 28MB | 45ms |
postgres.js | 1.5ms | 20MB | 30ms |
TypeORM | 3.2ms | 45MB | 120ms |
Bun 1.2 では、AWS S3 とのやり取りがこれまでになく簡単になりました。 AWS SDK の複雑な設定なしに、直感的な API で S3 操作が可能です。
// S3バケットへのファイルアップロード
const file = await Bun.file('./image.png');
await Bun.s3.upload({
bucket: 'my-bucket',
key: 'images/photo.png',
body: file,
});
// S3からのファイルダウンロード
const downloaded = await Bun.s3.download({
bucket: 'my-bucket',
key: 'images/photo.png',
});
await Bun.write('./downloaded-image.png', downloaded);
// バケット内のファイル一覧取得
const files = await Bun.s3.list({
bucket: 'my-bucket',
prefix: 'images/',
maxKeys: 100
});
files.forEach(file => {
console.log(`${file.key} - ${file.size} bytes`);
});
// 大容量ファイルのマルチパートアップロード
const largeFile = await Bun.file('./video.mp4');
const upload = await Bun.s3.createMultipartUpload({
bucket: 'my-bucket',
key: 'videos/large-video.mp4'
});
// チャンクごとにアップロード
const chunkSize = 5 * 1024 * 1024; // 5MB
for (let i = 0; i < largeFile.size; i += chunkSize) {
const chunk = await largeFile.slice(i, i + chunkSize);
await upload.uploadPart(chunk);
}
await upload.complete();
// 期限付きURLの生成
const presignedUrl = await Bun.s3.getSignedUrl({
bucket: 'my-bucket',
key: 'private/document.pdf',
expires: 3600, // 1時間
operation: 'getObject'
});
// アップロード用のプリサインURL
const uploadUrl = await Bun.s3.getSignedUrl({
bucket: 'my-bucket',
key: 'uploads/new-file.txt',
expires: 600, // 10分
operation: 'putObject'
});
Bun 1.2 では、従来のバイナリ形式から人間が読めるテキストベース形式に移行しました。 これにより、バージョン管理やコードレビューが格段に簡単になります。
チャートを読み込み中...
# bun.lockfile v0
# This file is auto-generated. Do not edit directly.
"react@^18.2.0":
version "18.2.0"
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kHXdvzh3wDn+1jKeLh5Q7vJptKo9Q==
dependencies:
loose-envify "^1.1.0"
"next@^14.0.0":
version "14.0.4"
resolved "https://registry.npmjs.org/next/-/next-14.0.4.tgz"
dependencies:
"@next/env" "14.0.4"
react "^18.2.0"
react-dom "^18.2.0"
bun update
で最新化Bun 1.2 では、Express フレームワークとの統合が大幅に最適化されました。 内部的な最適化により、同じコードでも劇的なパフォーマンス向上を実現します。
メトリクス | Node.js + Express | Bun 1.2 + Express | 改善率 |
---|---|---|---|
リクエスト/秒 | 15,000 | 45,000 | 3.0x |
レイテンシ (p50) | 2.1ms | 0.7ms | 3.0x |
レイテンシ (p99) | 8.5ms | 2.8ms | 3.0x |
メモリ使用量 | 120MB | 45MB | 2.7x |
// app.js - Bunで動作するExpressアプリ
import express from 'express';
import { Bun } from 'bun';
const app = express();
app.use(express.json());
// PostgreSQLとの統合
const db = await Bun.sql({
host: 'localhost',
database: 'api_db'
});
app.get('/api/users', async (req, res) => {
const users = await db`SELECT * FROM users LIMIT 100`;
res.json(users);
});
app.post('/api/users', async (req, res) => {
const { name, email } = req.body;
const [user] = await db`
INSERT INTO users (name, email)
VALUES (${name}, ${email})
RETURNING *
`;
res.status(201).json(user);
});
// Bunのネイティブサーバーで起動
Bun.serve({
fetch: app.fetch,
port: 3000,
});
console.log('Server running at http://localhost:3000');
Bun 1.2 では、Node.js API の 99%以上が実装され、既存プロジェクトの移行が ほぼシームレスに行えるようになりました。
Node.js API | Bun 1.1 | Bun 1.2 | 状態 |
---|---|---|---|
fs/promises | 部分的 | 完全対応 | ✅ |
crypto | 80% | 100% | ✅ |
stream | 70% | 95% | ✅ |
cluster | 未対応 | 実験的 | 🚧 |
worker_threads | 基本機能 | 完全対応 | ✅ |
bun install
で依存関係をインストールbun run
でスクリプトを実行してテストBun 1.2 は、JavaScript開発者にとって画期的なアップデートです。 ビルトインのデータベースクライアントと S3 サポートにより、外部依存を削減しながら パフォーマンスを大幅に向上させることができます。
Bun 1.2 は、開発者の生産性とアプリケーションのパフォーマンスを 同時に向上させることを目指しています。
curl -fsSL https://bun.sh/install | bash
bun run start