TL;DR

Bun dùng bun add <pkg> để thêm package mới - không phải bun install <pkg>. Lý do? Jarred Sumner, creator của Bun, luôn dùng Yarn trước khi xây dựng Bun. Yarn thì có yarn add. Thế là Bun có bun add. Một quyết định thiết kế xuất phát từ thói quen cá nhân của một lập trình viên - và giờ hàng triệu developer phải nhớ theo.

Câu chuyện thật sự

Tuần này, Jarred Sumner đăng một tweet ngắn trên X, tiết lộ nguồn gốc của một trong những điểm gây nhầm lẫn nhất của Bun package manager:

"Khi Bun v0.1 ra mắt, một trong những feedback lớn nhất là: tại sao bun install <pkg> không chạy? Tại sao tôi phải gõ bun add <pkg>? Tôi luôn dùng Yarn - mà Yarn thì làm theo cách đó. Nên bây giờ tôi nghĩ đến điều này mỗi khi thấy ai gõ cli add <pkg>."

Không phải triết lý thiết kế sâu xa. Không phải benchmark hay RFC. Chỉ là: creator dùng Yarn, nên anh ấy nghĩ add là chuẩn. Và Bun được xây dựng với logic đó từ những ngày đầu tiên.

bun add hay bun install - phân biệt cho rõ

Đây là điểm nhiều developer nhầm khi mới chuyển sang Bun, đặc biệt nếu xuất phát từ npm:

Muốn làm gìnpmBunYarnpnpm
Cài tất cả depsnpm installbun installyarn installpnpm install
Thêm package mớinpm install <pkg>bun add <pkg>yarn add <pkg>pnpm add <pkg>
Chạy packagenpx <pkg>bunx <pkg>yarn dlx <pkg>pnpm dlx <pkg>
CI reproduciblenpm cibun ciyarn install --immutablepnpm install --frozen-lockfile

npm là trường hợp đặc biệt: nó dùng install cho cả hai mục đích - cài tất cả và thêm mới. Yarn, pnpm, và Bun đều tách riêng hai lệnh này. Và cả ba đều dùng add để thêm package mới. Nếu bạn từng dùng Yarn hay pnpm trước khi đến với Bun, bạn sẽ thấy CLI của Bun hoàn toàn tự nhiên.

Từ v0.1 đến 89.7k stars

Bun v0.1.1 ra mắt ngày 5 tháng 7 năm 2022. Lúc đó, tool còn rất thô - có Web Streams, WebSocket global, dynamic require, và 50% nhanh hơn TextEncoder. Đủ để gây chú ý, cũng đủ để nhận về hàng đống feedback về CLI.

Ba năm sau, Bun đã là một câu chuyện khác. v1.0 ra mắt tháng 9 năm 2023, production-ready. Hiện tại là v1.3.13, với những con số đáng nể:

  • Cold install: 0.8 giây so với npm 14 giây - nhanh hơn 18 lần
  • Warm install với cache: 0.3 giây so với npm 8 giây
  • 17 lần ít RAM hơn khi streaming tarballs xuống disk (v1.3.13)
  • 48 network requests đồng thời mặc định khi install
  • Dùng clonefile trên macOS, hardlink trên Linux - fastest system calls có sẵn

89.7k GitHub stars. 896 contributor. 62k project dùng Bun làm dependency. Anthropic chạy Bun trong production cho Claude Code.

Bài học thiết kế từ một tweet

Câu chuyện của Jarred thú vị không phải vì nó giải thích một CLI quirk. Nó thú vị vì nó cho thấy cách API được sinh ra trong thực tế: từ thói quen, từ tool người tạo ra nó đang dùng hàng ngày, từ những quyết định không-ai-ngồi-xuống-để-quyết-định.

Khi bạn xây dựng một tool, những lựa chọn thiết kế của bạn phản chiếu mental model của chính bạn. Jarred dùng Yarn - nên Bun có bun add. Nếu anh ấy là npm user từ đầu, rất có thể hôm nay chúng ta đã gõ bun install <pkg> mà không ai phàn nàn gì.

Điều đó cũng có nghĩa: khi bạn thấy một CLI trông "kỳ lạ", rất có thể đằng sau nó là một câu chuyện như thế này - không phải thiếu suy nghĩ, mà là suy nghĩ được đặt trong một context khác với context của bạn.

Bạn có nên dùng Bun không?

Với project TypeScript mới: nên thử ngay. Native TS/JSX không cần config, install nhanh, một tool cho runtime, bundler, test runner và package manager.

Với project legacy cần 100% Node.js compat: chờ thêm. Bun hiện ~99% compatible, vẫn còn edge cases ở vm module và một số crypto methods.

Với CI/CD pipeline: rất đáng. 18 lần nhanh hơn npm nghĩa là pipeline ngắn hơn, cost thấp hơn. Bun có official GitHub Action (oven-sh/setup-bun) và Vercel support sẵn.

Và khi bạn chuyển sang dùng, nhớ một điều: bun add <pkg>, không phải bun install <pkg>. Bây giờ bạn đã biết tại sao.

Nguon: @jarredsumner tren X, Bun documentation, DeployHQ benchmark.