← 記事一覧に戻る

Bun使ったら最高すぎた件

#Bun#JavaScript#TypeScript

Bunって何がすごいの?

みなさん、Bun使ってますか?

「速いらしいけど、それだけでしょ?」って思ってる方、ちょっと待ってください。実はBunには開発者をワクワクさせる便利機能がめちゃくちゃ詰まってるんです。

ランタイム、パッケージマネージャ、バンドラ、テストランナーが全部入り。これ1つあれば何でもできちゃう。今回は個人的に「これ最高!」と思った機能を紹介していきます!

catalog機能で依存関係管理が超ラクに

モノレポで開発してる人、バージョン管理で消耗してませんか?

今までの地獄

複数パッケージで同じライブラリ使ってると、こんな状況になりがち…

packages/
├── app/
│   └── package.json  # "react": "^18.3.1"
├── ui/
│   └── package.json  # "react": "^18.3.1"  ← 同じやつ書くの面倒...
└── utils/
    └── package.json  # "react": "^18.3.1"  ← またここにも...

バージョン上げるときに全部書き換えるの、絶対どこか忘れるやつですよね。

catalogで一発解決

ルートのpackage.jsonにまとめて書けばOK!

{
  "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箇所直すだけ。これだけで全部揃う。控えめに言って神。

用途別に分けたいなら 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"
  }
}

パブリッシュも自動でいい感じに

bun publishするとcatalog:が実際のバージョンに自動変換されます。手動で書き換える必要なし!

TypeScriptがそのまま動く

設定とか面倒なことは一切なし。

# Node.jsだと...
npx ts-node index.ts  # または npx tsx index.ts

# Bunだと?
bun index.ts  # 以上!

これだけ。tsconfig.jsonも勝手に読んでくれる。型チェックはしないから爆速でトランスパイル&実行してくれます。

型チェックしたいときはbun --bun tscを別で叩けばOK。

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そのままいける
  • スナップショットテストもOK
  • --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で同じコードが動く。ビルドスクリプトに最適!

DBクライアントもビルトイン

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機能: モノレポの依存関係管理が1箇所で完結
  • TypeScriptネイティブ: 設定ゼロでそのまま実行
  • 爆速パッケージマネージャ: npmの20〜100倍
  • 組み込みテストランナー: 追加インストール不要
  • bun shell: どのOSでも同じシェルスクリプト
  • Built-in SQLクライアント: DBも繋げちゃう

個人的にはcatalog機能に一番感動しました。モノレポで依存関係管理に疲弊してた過去の自分に教えてあげたい…

ぜひ試してみてください!

参考リンク