次世代ツールBunをNext.jsで検証したら高速だった - pnpmとの比較
はじめまして、_minoです!
この記事では、「pnpmとbunってどのような違いがあるのか」、「Next.jsプロジェクトにBunを導入してもいいのでは」と思い、最新トレンドやパフォーマンスを比較しながらまとめました。
また、10月22日に行われる Next Conf のキャストにBun関係者がいるらしく、BunとNext.jsの連携について何か発表があるかもしれないので、早めにキャッチアップしておきたいと思いまとめています。
「パッケージマネージャについてって何?」という方には、こちらの解説記事がわかりやすいです!
🚀 比較するパッケージマネージャー
pnpm
特徴
- ディスク効率: グローバルストア(~/.pnpm-store)に全パッケージを1回だけ保存し、各プロジェクトはハードリンクで参照。(例:10個のプロジェクトが同じReact v18を使っても、ディスクには1つのReactのみ保存される。)
- 高速インストール: npmと比較して約3倍高速(公式ベンチマーク)。
-
厳密な依存関係管理:
package.json
に記載していないパッケージへのアクセスを防止。Phantom Dependencies問題を解決。 - ディスク容量削減: 共通の依存関係を持つ複数プロジェクトで、npmと比較して最大90%のディスク容量削減。
Bun
特徴
- 高速な実行速度: Zigで実装、JavaScriptCoreエンジン使用。Node.jsと比較して起動時間が2-4倍高速。
- オールインワン: ランタイム、パッケージマネージャー、バンドラー、テストランナーを1つに統合。
- ゼロコンフィグ: TypeScript・JSXが設定なしで即動作。ビルド設定が不要。
- npm互換性: 多くのnpmパッケージと互換性があるが、ネイティブバインディングを含むパッケージでは制限あり。
📚 トレンド・注目度
GitHubスター数
Star Historyチャート(GitHubスター数の推移)はこちらになります。
Bunは2023年9月にv1がリリースされたにもかかわらず急速に人気を伸ばしており、優れた機能とパフォーマンスを備えています。オールインワン設計も支持を集める大きな要因といえるでしょう。
pnpmもスター数が多く、大規模導入の実績と効率的な管理方式で高い評価を得ています。
Vercel、Coderabbit、Discordといったスポンサーの支援があるのも強みです。
採用事例
pnpmは、ByteDance(TikTok)、Microsoft(一部のシステムで利用)、主要OSS(Next.js、Vite、Prisma)プロジェクトで本格採用されています。
Bunは、Xの一部システム(一部報告によると)や個人開発で採用が進んでいますが、エンタープライズでの本格採用はこれからのようです。一部の企業での実績はあるとの報告もあります。また、MiddayやElysiaのような中規模程度の開発実績があり、今後に期待できそうです。
📊 パフォーマンス比較
実際の開発プロジェクトを想定し、以下の技術スタックでローカル環境、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機能を使用して一元管理することができます。(かなり便利です!)
// 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
依存関係管理(安全性)
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投稿が、ユニークすぎて面白いです(笑)
👀 おわり
最後まで読んでくださり、ありがとうございました!☺️
この記事を通して、少しでも開発のお役に立てば幸いです!
個人ブログでも「技術選定に関すること」や「最新技術の分析・深掘り」など学びや知見を発信しています。もしご興味のある方はこちらからご確認いただけますと幸いです!
過去の執筆記事
Discussion