Bunの便利機能まとめ
はじめに
- BunはJavaScript/TypeScriptのオールインワンツールチェーンです
- ランタイム、パッケージマネージャ、バンドラ、テストランナーが1つに統合されています
- 「速い」だけでなく、開発体験を向上させる便利機能が多数あります
- この記事では特に便利だと感じた機能を紹介します
catalog機能
モノレポで複数パッケージの依存関係バージョンを一元管理できる機能です。v1.2.14で追加されました。
従来の課題
モノレポで複数のパッケージがある場合、各パッケージで同じ依存関係のバージョンを揃えるのが大変でした。
packages/
├── app/
│ └── package.json # "react": "^18.3.1"
├── ui/
│ └── package.json # "react": "^18.3.1" ← 同じバージョンを書く必要がある
└── utils/
└── package.json # "react": "^18.3.1" ← ここも...
バージョンを上げるときは全てのpackage.jsonを修正する必要があり、漏れや不整合が起きやすい状態でした。
catalogの使い方
ルートのpackage.jsonでバージョンを一元定義します。
{
"name": "my-monorepo",
"workspaces": ["packages/*"],
"catalog": {
"react": "^18.3.1",
"react-dom": "^18.3.1",
"typescript": "^5.7.2",
"zod": "^3.24.1"
}
}
各ワークスペースではcatalog:プロトコルで参照します。
{
"name": "@myorg/app",
"dependencies": {
"react": "catalog:",
"react-dom": "catalog:",
"zod": "catalog:"
}
}
これでバージョン管理がルートに集約され、更新時は1箇所を変更するだけでOKになります。
named catalogs
用途別に複数のカタログを定義することもできます。
{
"workspaces": ["packages/*"],
"catalogs": {
"default": {
"react": "^18.3.1",
"typescript": "^5.7.2"
},
"testing": {
"vitest": "^2.1.0",
"@testing-library/react": "^16.0.0"
}
}
}
参照時はカタログ名を指定します。
{
"dependencies": {
"react": "catalog:default"
},
"devDependencies": {
"vitest": "catalog:testing"
}
}
publishとの連携
bun publishやbun pm packを実行すると、catalog:参照が自動的に実際のバージョン番号に置き換わります。公開時に手動で書き換える必要はありません。
TypeScriptネイティブサポート
BunはTypeScriptをそのまま実行できます。
# Node.jsの場合
npx ts-node index.ts # または npx tsx index.ts
# Bunの場合
bun index.ts # これだけ!
- tsconfig.jsonの設定も自動で読み込まれます
- 型チェックはせず、高速にトランスパイル&実行します
- 型チェックが必要な場合は
bun --bun tscを別途実行します
bun installの速さ
npmと比較して20〜100倍高速です(環境による)。
# 体感できるレベルで速い
bun install
- ハードリンクとシンボリックリンクを活用したキャッシュ
- 並列ダウンロード
- ネイティブコード(Zig)による実装
一度体験するとnpmに戻れなくなります。
組み込みテストランナー
Jestライクな構文でテストを書けます。追加パッケージ不要です。
// sum.test.ts
import { expect, test, describe } from "bun:test";
describe("sum", () => {
test("1 + 2 = 3", () => {
expect(1 + 2).toBe(3);
});
});
bun test
- Jest互換のAPI
- TypeScriptそのまま実行可能
- スナップショットテスト対応
--watchモードあり
bun shell
クロスプラットフォームで動くシェルスクリプトをJavaScript/TypeScriptで書けます。
import { $ } from "bun";
// シンプルなコマンド実行
await $`echo Hello, World!`;
// 変数の埋め込み
const name = "Bun";
await $`echo Hello, ${name}!`;
// パイプ
const result = await $`cat package.json | grep name`.text();
Windows/macOS/Linuxで同じコードが動くため、ビルドスクリプトなどに便利です。
Built-in SQLクライアント
v1.2からPostgreSQL、MySQL、SQLiteへの接続がビルトインでサポートされました。
import { SQL } from "bun";
const db = new SQL("postgres://localhost/mydb");
const users = await db.query("SELECT * FROM users WHERE id = $1", [1]);
ORMを使わないシンプルなクエリには十分です。
まとめ
Bunは「速い」だけでなく、開発体験を向上させる機能が豊富です。
- catalog機能: モノレポの依存関係バージョン管理が楽になる
- TypeScriptネイティブ: 設定なしでそのまま実行
- 高速パッケージマネージャ: npmの20〜100倍速い
- 組み込みテストランナー: 追加パッケージ不要
- bun shell: クロスプラットフォームなシェルスクリプト
- Built-in SQLクライアント: データベース接続もビルトイン
個人的にはcatalog機能に感動しました。モノレポでの依存関係管理の煩わしさが解消されるのは本当にありがたいです。