🎉

次世代ツールBunをNext.jsで検証したら高速だった - pnpmとの比較

に公開

はじめまして、_minoです!

この記事では、「pnpmとbunってどのような違いがあるのか」、「Next.jsプロジェクトにBunを導入してもいいのでは」と思い、最新トレンドやパフォーマンスを比較しながらまとめました。

また、10月22日に行われる Next Conf のキャストにBun関係者がいるらしく、BunとNext.jsの連携について何か発表があるかもしれないので、早めにキャッチアップしておきたいと思いまとめています。

「パッケージマネージャについてって何?」という方には、こちらの解説記事がわかりやすいです!
https://www.hitachi-solutions.co.jp/sbom/blog/2023033101/

🚀 比較するパッケージマネージャー

pnpm

特徴

  • ディスク効率: グローバルストア(~/.pnpm-store)に全パッケージを1回だけ保存し、各プロジェクトはハードリンクで参照。(例:10個のプロジェクトが同じReact v18を使っても、ディスクには1つのReactのみ保存される。)
  • 高速インストール: npmと比較して約3倍高速(公式ベンチマーク)。
  • 厳密な依存関係管理: package.jsonに記載していないパッケージへのアクセスを防止。Phantom Dependencies問題を解決。
  • ディスク容量削減: 共通の依存関係を持つ複数プロジェクトで、npmと比較して最大90%のディスク容量削減。

https://pnpm.io/

Bun

特徴

  • 高速な実行速度: Zigで実装、JavaScriptCoreエンジン使用。Node.jsと比較して起動時間が2-4倍高速。
  • オールインワン: ランタイム、パッケージマネージャー、バンドラー、テストランナーを1つに統合。
  • ゼロコンフィグ: TypeScript・JSXが設定なしで即動作。ビルド設定が不要。
  • npm互換性: 多くのnpmパッケージと互換性があるが、ネイティブバインディングを含むパッケージでは制限あり。

https://bun.sh/

📚 トレンド・注目度

GitHubスター数

Star Historyチャート(GitHubスター数の推移)はこちらになります。

Bunは2023年9月にv1がリリースされたにもかかわらず急速に人気を伸ばしており、優れた機能とパフォーマンスを備えています。オールインワン設計も支持を集める大きな要因といえるでしょう。

pnpmもスター数が多く、大規模導入の実績と効率的な管理方式で高い評価を得ています。
Vercel、Coderabbit、Discordといったスポンサーの支援があるのも強みです。

採用事例

pnpmは、ByteDance(TikTok)、Microsoft(一部のシステムで利用)、主要OSS(Next.js、Vite、Prisma)プロジェクトで本格採用されています。

Bunは、Xの一部システム(一部報告によると)や個人開発で採用が進んでいますが、エンタープライズでの本格採用はこれからのようです。一部の企業での実績はあるとの報告もあります。また、MiddayElysiaのような中規模程度の開発実績があり、今後に期待できそうです。

📊 パフォーマンス比較

実際の開発プロジェクトを想定し、以下の技術スタックでローカル環境、CI/CD環境のパフォーマンスを測定しました。

フレームワーク: Next.js 15 (TypeScript)
認証: Firebase Auth
DB: Supabase Database
UI/スタイル: Tailwind CSS + shadcn/ui (46コンポーネント)
状態管理: Zustand
ORM: Drizzle ORM
バリデーション: Zod
ユーティリティ: date-fns
メール送信: Resend
テスト: Vitest (pnpm) / Bun Test (bun)
テストケース: 100ファイル、470テスト

インストール時間

条件 pnpm bun bunの優位性
キャッシュなし(初回) 15.16秒 6.89秒 55%高速
キャッシュあり(2回目) 5.44秒 2.79秒 49%高速

テスト実行時間(470テスト)

項目 pnpm + vitest bun test bunの優位性
テスト実行のみ 480ms 46ms 10倍高速
トータル時間(起動含む) 7.15秒 0.05秒 143倍高速

ビルド時間

項目 pnpm bun
ビルド時間 10.48秒 10.68秒 ほぼ同じ

CI/CD時間(GitHub Actions)

項目 pnpm bun bunの優位性
インストール(キャッシュなし) 1.13秒 0.21秒 81%高速
インストール(キャッシュあり) 6.30秒 2秒 68%高速
テスト実行(470テスト) 6.46秒 0.09秒 72倍高速
ビルド 13.71秒 13.80秒 ほぼ同等
合計(キャッシュなし) 21.30秒 14.10秒 34%高速
合計(キャッシュあり) 26.47秒 15.89秒 40%高速

ディスク使用量

項目 pnpm bun 差分
node_modules 779MB 732MB -47MB (bunが6%小さい)
lockfile 291KB 191KB -100KB (bunが34%小さい)
グローバルキャッシュ 13GB 5.6GB -7.4GB (bunが57%小さい)

パフォーマンス比較まとめ

pnpm自体もnpmやyarn(classic)と比較すると高速・効率的ですが、bunはさらに上回る性能を示しています。特にテストの実行速度において、その差は顕著です。

項目 pnpm bun
初回インストール ⚪︎ 高速 ◎ 非常に高速
キャッシュ済みインストール ⚪︎ 高速 ◎ 非常に高速
ビルド時間 ⚪︎ 標準 ⚪︎ 標準
開発サーバー起動 ⚪︎ 標準 ◎ 高速
テスト実行 ⚪︎ 標準 ◎ 非常に高速
CI/CD環境 ⚪︎ 標準 ◎ 非常に高速
ディスク使用量 ⚪︎ 効率的 ◎ 非常に効率的

🧪 機能比較

技術選定で重要となる項目について比較しました。
それ以外にも独自機能や便利な機能もあるので公式ドキュメントで確認していただけますと幸いです。

モノレポ対応

pnpmの場合

ルートにpnpm-workspace.yaml ファイルを作成して以下のように定義します。

# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'apps/*'

catalog:
  react: ^18.2.0
  next: ^14.0.0
  typescript: ^5.3.0
  "@types/react": ^18.2.0
  "@types/node": ^20.0.0
  eslint: ^8.50.0
  prettier: ^3.0.0
  vitest: ^1.0.0

バージョン統一管理があり、pnpm-workspace.yamlでcatalog機能を使用して一元管理することができます。(かなり便利です!)
https://pnpm.io/ja/catalogs

// apps/web/package.json
{
  "name": "@monorepo/web",
  "dependencies": {
    "react": "catalog:",
    "next": "catalog:",
    "@monorepo/ui": "workspace:*"  // ワークスペース内パッケージ参照
  },
  "devDependencies": {
    "typescript": "catalog:",
    "eslint": "catalog:"
  }
}

bunの場合

ルートの package.json を以下のように定義します。

// package.json
{
  "workspaces": [
    "packages/*",
    "apps/*"
  ],
  "devDependencies": {
    "typescript": "^5.3.0",
    "eslint": "^8.50.0",
    "prettier": "^3.0.0"
  }
}
// apps/web/package.json
{
  "name": "@monorepo/web",
  "dependencies": {
    "react": "^18.2.0",
    "next": "^14.0.0",
    "@monorepo/ui": "*"  // ワークスペース内パッケージ参照
  }
}

テスト対応

pnpmの場合
外部ライブラリ(jest, vitest等)をインストールして使用する必要があります。 セットアップや設定ファイルの準備が必要で、TypeScriptを使う場合はts-jestなどの追加設定も必要になります。

// package.json
{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage"
  },
  "devDependencies": {
    "jest": "^29.7.0",
    "@types/jest": "^29.5.0",
    "ts-jest": "^29.1.0"
  }
}

bunの場合
テストランナーでもあるため、テストも最初から含まれています。 設定ファイル不要で、TypeScriptやJSXもそのままテスト可能です。

# 単体テストの実行
bun test

# 特定のファイルのみテスト
bun test ./src/components

# watchモード
bun test --watch

# カバレッジ測定
bun test --coverage

https://bun.com/docs/cli/test


依存関係管理(安全性)

pnpmの場合
宣言していないパッケージは使用不可という厳密な仕組み。「たまたま動いていた」が本番環境で動かないリスクを防止し、チーム開発での依存関係の問題を早期発見できます。

bunの場合
インストール後の自動実行スクリプト(postinstall)をデフォルトで無効化。 悪意のあるコードの実行を防ぎ、信頼できるパッケージのみ個別に許可する安全設計です。


TypeScript/JSX直接実行

pnpmの場合
TypeScriptやJSXを実行するには、tsx、ts-node、esbuild-runner等の追加ツールが必要です。 設定ファイル(tsconfig.json)の調整も必要な場合があります。

// package.json
{
  "scripts": {
    "dev": "tsx watch src/index.ts"
  }
}
# tsx等の実行ツールをインストール
pnpm add -D tsx

# TypeScriptファイルを実行
pnpm tsx script.ts
pnpm tsx component.tsx

bunの場合
TypeScriptとJSXをネイティブサポート。 トランスパイル不要で直接実行でき、tsconfig.jsonの設定も自動的に認識します。追加ツールのインストールは不要です。

# そのまま実行可能
bun run script.ts
bun run component.tsx

# watchモードも標準搭載
bun --watch src/index.ts

npm互換性(再利用性)

pnpmの場合
関連パッケージ(peer dependencies)を自動でインストール。「○○が見つかりません」エラーを減らし、既存npmパッケージの利用をスムーズにします。

bunの場合
WindowsでもMac/Linuxと同じシェルコマンドが使用可能。OSごとに異なるスクリプトを書く必要がなく、npm scriptsの可搬性を向上させます。


Node.js互換性(移行性)

pnpmの場合

  • C++で書かれた高速な拡張機能(ネイティブアドオン)も含め、すべてのNode.js機能が使用可能。
  • Node.js上で動作するため、Node.jsのバージョンアップに自動的に追従。

bunの場合

  • デバッグツールや対話型コンソールなど開発補助ツールの一部が未対応(基本的なWeb開発には影響なし)。
  • JavaScriptCore(Safari系エンジン)を使用し、通常の開発では問題ないが、低レベルな操作では互換性の確認が必要。

機能比較まとめ

機能 pnpm Bun
モノレポ対応 workspaces対応 workspaces対応
バージョン統一管理 catalog機能 ルートpackage.jsonで管理
テスト実行 別途ツール必要 内蔵 (bun test)
依存関係管理 シンボリックリンク方式 ハードリンク方式
TypeScript実行 別途ツール必要 ネイティブ対応
npm互換性 完全対応 ほぼ完全対応
Node.js互換性 100% 主要API対応済み、一部制限あり

🧩 ホスティング環境比較(Vercel, Cloud Run)

Next.jsのホスティング先として候補に上がるVercelとCloud Runでの比較についてまとめています。
数秒の差ではありますが、Vercel、Cloud RunともにBunが優位な傾向でした。

Vercelにデプロイ時の比較

特にInstall時間でBunの優位性が顕著で、合計20%の短縮を実現しています。

pnpm bun bunの優位性
Install時間 5.1秒 3.73秒 27%高速
Build時間 12.5秒 10.4秒 17%高速
合計時間 17.63秒 14.17秒 20%高速

Cloud Runにデプロイ時の比較

初回ビルドの差は小さいものの、キャッシュビルド時にBunが48%高速という大きな差が出ました。

pnpm bun bunの優位性
初回ビルド 67秒 64秒 5%高速
キャッシュビルド 5.98秒 3.09秒 48%高速
イメージサイズ 957MB 940MB 1.8%削減

📌 個人的所感

Bunはパフォーマンスが優れており、オールインワンツールとして機能も豊富なため、積極的に採用していきたいです。一方で、まだリリースから間もないこともあり、大規模開発や受託開発のようなクライアントファーストな案件では、現状はpnpmを選ぶのが良さそうです。

個人開発レベルや、最新技術を取り入れていきたい自社プロダクトであれば、将来性も見込んで現時点でBunを導入しても問題ないと思います(ただし、一部対応していない箇所もあるので注意が必要です)。

開発体験はもちろん、コミュニティの盛り上がりもBunは他と比べてかなり活発なので、総合的におすすめです!

余談(ネタです)

BunコミュニティのX投稿が、ユニークすぎて面白いです(笑)
https://x.com/bunjavascript/status/1974079383318237357
https://x.com/bunjavascript/status/1973381144792957276

👀 おわり

最後まで読んでくださり、ありがとうございました!☺️
この記事を通して、少しでも開発のお役に立てば幸いです!

個人ブログでも「技術選定に関すること」や「最新技術の分析・深掘り」など学びや知見を発信しています。もしご興味のある方はこちらからご確認いただけますと幸いです!
https://techbuild.app/blog

過去の執筆記事
https://zenn.dev/m_noto/articles/a2c09f741ba65e
https://zenn.dev/m_noto/articles/a73dc4291983e6

Discussion