pnpm vs Bun vs Yarn Berry untuk Monorepo 2026
Tiga package manager dengan strategi beda untuk monorepo. Saya pakai pnpm 24 bulan, Bun 14 bulan, Yarn Berry 10 bulan. Verdict tergantung shape monorepo.
TL;DR
- pnpm: Paling matang untuk monorepo. Workspaces robust, hoisting strict, ekosistem terbesar. Conditional Recommend.
- Bun: Tercepat (install 3-5x, script 2-3x). Runtime built-in. Conditional Recommend.
- Yarn Berry: Plug’n’Play powerful, zero-install offline. Ekosistem plugin kecil. Conditional Recommend.
- Verdict: pnpm default safe untuk team. Bun untuk speed-first solo. Yarn Berry untuk niche.
Konteks
Saya pakai ketiga di 11 monorepo project SMB Indonesia 2024-2026:
- pnpm (7 monorepo): SaaS dental Jakarta (apps/web + apps/admin + packages/ui), ecommerce klinik (3 app + 4 package), admin HR, dan 4 lainnya
- Bun (3 monorepo): MVP startup AI (apps/web + apps/api + packages/sdk), portfolio personal monorepo, internal tool warung
- Yarn Berry (1 monorepo): legacy klien yang sudah pakai Yarn Berry — tidak migrate karena cost > benefit
Total 24 bulan compare.
Pricing (Juni 2026)
Ketiga gratis dan open-source. Cost = waktu install + CI minute.
Estimasi cost CI untuk monorepo medium (10 package, install + build):
| Manager | Install time | CI minute/PR |
|---|---|---|
| npm | 95s | 3.5 min |
| Yarn Classic | 75s | 3.0 min |
| pnpm | 35s | 1.8 min |
| Yarn Berry | 28s | 1.6 min |
| Bun | 12s | 1.2 min |
Untuk team 3-5 dev × 5 PR/hari × 30 hari = 450-750 CI run/bulan. Cost CI di GitHub Actions:
- npm: ~600 min/bulan = ~$5
- pnpm: ~300 min/bulan = ~$2.5
- Bun: ~200 min/bulan = ~$1.5
Bun saving terbesar di scale. pnpm sweet spot stability + speed.
Feature comparison
| Feature | pnpm | Bun | Yarn Berry |
|---|---|---|---|
| Workspaces | Yes (mature) | Yes (since 1.0) | Yes (mature) |
| Strict hoisting | Yes | Yes | Yes (PnP) |
| Symlink-based | Yes | Yes (default) | No (PnP) |
| Lockfile | pnpm-lock.yaml | bun.lockb | yarn.lock |
| Script runner | pnpm run | bun run (fastest) | yarn run |
| Built-in runtime | No (Node) | Yes (Bun runtime) | No (Node) |
| Turborepo integration | Excellent | Good | Excellent |
| Nx integration | Excellent | Limited | Excellent |
| Offline support | Cache-based | Cache-based | Zero-install (best) |
| Plugin ecosystem | Medium | Small | Medium |
| Windows support | Excellent | Good (improving) | Excellent |
| Disk space efficiency | Excellent (content-addressable) | Good | Excellent (PnP) |
Performance benchmark
Test: monorepo 12 package, 1.2 GB node_modules total.
Fresh install (cold cache)
| Manager | Time |
|---|---|
| npm | 2m 35s |
| Yarn Classic | 1m 58s |
| pnpm | 48s |
| Yarn Berry | 38s |
| Bun | 18s |
Subsequent install (warm cache)
| Manager | Time |
|---|---|
| npm | 45s |
| Yarn Classic | 32s |
| pnpm | 12s |
| Yarn Berry | 8s |
| Bun | 4s |
Run script (build all)
| Manager | Time |
|---|---|
| npm run build | 18s |
| pnpm run build | 12s |
| yarn build | 15s |
| bun run build | 9s |
Bun menang clear untuk speed. pnpm + Yarn Berry similar (both jauh lebih cepat dari npm).
Disk usage (after install)
| Manager | node_modules size |
|---|---|
| npm | 1.2 GB |
| Yarn Classic | 1.1 GB |
| pnpm | 380 MB (content-addressable) |
| Yarn Berry (PnP) | 12 MB (no node_modules, .pnp.cjs) |
| Bun | 410 MB |
Yarn Berry PnP menang disk space karena no node_modules. Tapi compatibility issue dengan beberapa tool (TypeScript, Webpack).
Trade-off
pnpm
Pro: Default safe untuk monorepo team. Strict hoisting = no accidental dep. Content-addressable storage = save disk (single copy per version global). Turborepo + Nx integration excellent. Documentation matang. Community besar.
Con: Tidak as cepat as Bun. Tidak ada built-in runtime (butuh Node). Strict mode kadang reveal peer dep warning yang noisy.
Bun
Pro: Tercepat untuk semua workflow (install, script, test, runtime). Built-in runtime = tidak butuh Node separate. bun.lockb binary lockfile = parse cepat. Ekosistem growing rapidly. Bun 2.0 monorepo matang.
Con: Compatibility kadang issue dengan tool legacy (post-install script, native modules). Windows support improving tapi tidak as polished as pnpm. Ekosistem plugin (Turborepo, Nx) sedikit lag dari pnpm.
Yarn Berry
Pro: Plug’n’Play = no node_modules, install 5-10x lebih cepat. Zero-install (commit cache ke git) = no install di CI. Plugin system powerful. Workspace mature.
Con: PnP compat issue dengan beberapa tool (Webpack 4, beberapa Babel plugin). Learning curve lebih steep. Community lebih kecil dari pnpm. Migration dari Yarn Classic non-trivial.
Konteks Indonesia
SaaS dental Jakarta (pnpm monorepo, 8 package): install 35s vs npm 2m. CI minute save 1.5 menit/PR × 80 PR/bulan = 120 menit save = save $1/bulan. Tapi DX gain (faster dev loop) significant — team 3 dev save 15-30 menit/hari × 22 hari = 5-11 jam/bulan saved per dev.
MVP AI startup (Bun monorepo, 4 package): install 12s vs pnpm 35s. Faster iteration untuk hot reload. Bun runtime untuk API (faster cold start). Total dev productivity 15-20% lebih tinggi.
Legacy klien (Yarn Berry, 6 package): maintain — tidak migrate karena cost > benefit. Tim familiar Yarn Berry workflow.
Use case decision matrix
| Scenario | Recommended |
|---|---|
| New monorepo, team 2-5 dev | pnpm |
| New monorepo, solo dev | Bun |
| Speed-first, modern stack (Hono, Astro) | Bun |
| Strict hoisting + team consistency | pnpm |
| Disk space constrained (CI cache) | Yarn Berry (PnP) |
| Legacy Yarn Classic migration | pnpm |
| Migrasi dari Yarn Berry (rare) | pnpm (lebih familiar) |
| Stack Bun-first (Bun runtime, Bun test) | Bun |
| Stack Next.js heavy + Turborepo | pnpm atau Yarn Berry |
Migration recipe
npm → pnpm (2-6 jam)
# 1. Backup
git checkout -b migrate/pnpm
cp package-lock.json package-lock.json.bak
# 2. Install pnpm
npm install -g pnpm
# 3. Convert
rm -rf node_modules package-lock.json
pnpm install
# 4. Add workspace config
echo "packages:
- 'apps/*'
- 'packages/*'" > pnpm-workspace.yaml
# 5. Update scripts (pnpm vs npm syntax sama)
# 6. Fix peer dep warning (manual)
# pnpm lebih strict — beberapa peer dep yang npm silent jadi warning
# 7. Update CI
# .github/workflows/ci.yml: ganti npm install → pnpm install
Yarn Classic → pnpm (3-8 jam)
# 1. Hapus yarn.lock + node_modules
rm -rf node_modules yarn.lock
# 2. pnpm install
pnpm install
# 3. Update package.json workspaces → pnpm-workspace.yaml
# 4. Update CI
pnpm → Bun (1-4 jam untuk modern project)
# 1. Install Bun
curl -fsSL https://bun.sh/install | bash
# 2. Convert
rm -rf node_modules pnpm-lock.yaml
bun install
# 3. Run test untuk verify
bun test
# 4. Update CI
# Replace pnpm install → bun install
# Replace pnpm run → bun run
Gotcha (lesson learned)
1. pnpm strict peer dep
pnpm 8+ default strict peer dep. Banyak package legacy declare peer dep tidak akurat. Workaround: auto-install-peers=true di .npmrc.
2. Bun native module compat
Beberapa native module (canvas, sharp tertentu) butuh compile native. Bun tidak selalu auto-handle. Workaround: pakai bunx --bun postinstall atau pre-build native binary.
3. Yarn Berry PnP + TypeScript
TypeScript pre-5.0 ada issue dengan PnP. TypeScript 5+ work. Pakai yarn dlx @yarnpkg/sdks vscode untuk editor support.
4. Lock file conflict di team
Jangan mix manager. Tim Anda harus commit ke 1 manager. Conflict pnpm-lock + package-lock = mess.
5. CI caching
- pnpm: cache
~/.pnpm-store - Bun: cache
~/.bun/install/cache - Yarn Berry: cache
.yarn/cache(atau zero-install: commit ke git)
Yang surprising
Bun monorepo maturity lebih cepat dari yang saya kira. Bun 1.0 (2024) monorepo support shaky. Bun 2.0 (Q1 2026) production-ready untuk monorepo medium. 3 project saya zero blocker.
pnpm strict hoisting catch banyak bug. Saya pernah punya project npm yang accidentally rely di hoisted dep (tidak di package.json). Migrate ke pnpm — break, lalu fix dengan explicit add ke package.json. Cleaner state.
Yarn Berry adoption Indonesia kecil. Dari 50+ dev yang saya kerja, < 5 yang aktif pakai Yarn Berry. Mostly pnpm atau npm.
Verdict
Conditional Recommend untuk ketiga:
Pakai pnpm jika:
- Monorepo team 2-5 dev
- Default safe untuk SMB Indonesia
- Pakai Turborepo / Nx
- Mixed skill team
Pakai Bun jika:
- Solo dev atau team kecil familiar
- Speed paling prioritas
- Stack Bun-first (Bun runtime, Bun test)
- Comfort dengan ekosistem yang lebih kecil
Pakai Yarn Berry jika:
- Legacy project yang sudah Yarn Berry
- Disk space constrained (CI cache)
- Comfort dengan PnP workflow
Skip jika: monorepo Anda kecil (< 3 package). npm workspaces cukup untuk simple case.
Untuk benchmark Bun specific: Bun vs pnpm vs npm Astro. Untuk monorepo tool: Turborepo vs Nx vs Bun workspace.
Ditulis oleh Asti Larasati