blog.dopana

Back

Cuối 2024, Jarred Sumner giới thiệu Bun — và nó nhanh chóng gây sốt. Không chỉ là runtime chạy JavaScript, Bun là một all-in-one toolkit: runtime, package manager, bundler, test runner — tất cả trong một binary duy nhất.

Từ đó đến nay (2026), Bun đã trưởng thành vượt bậc, đạt 90% Node.js API compatibility và trở thành lựa chọn thực tế cho nhiều dự án production.

Tốc Độ Đến Từ Đâu?#

Bun nhanh hơn Node.js nhờ ba yếu tố:

1. JavaScriptCore Thay Vì V8#

Hầu hết runtime JS dùng V8 (Node, Deno). Bun dùng JavaScriptCore — engine của Safari — vốn được tối ưu cho khởi động nhanh:

RuntimeEngineKhởi động
Node.jsV8Chậm hơn (JIT warming)
BunJavaScriptCoreNhanh hơn ~4x
DenoV8Tương tự Node

2. Viết Bằng Zig#

Zig là ngôn ngữ hệ thống không runtime, không GC — cho phép Bun kiểm soát bộ nhớ chi tiết mà vẫn an toàn:

// Zig cho phép Bun tối ưu thấp như C, an toàn như Rust
// mà không cần GC overhead
zig

3. Lazy Compilation — Không node_modules Ăn Mòn#

Bun không cần đọc toàn bộ dependency graph khi khởi động. Nó compile file khi thực sự cần — giảm cold start từ 500ms xuống còn ~150ms.

Bun Làm Được Gì?#

Bun Install — Thay Thế npm/yarn/pnpm#

# Nhanh hơn npm ~20x, yarn ~15x
bun install

# Lockfile riêng (bun.lock) — nhẹ hơn package-lock.json 5x
bash

Cơ chế: Bun dùng bun.lock binary thay vì JSON, parse nhanh hơn. Đồng thời nó tải package song song qua HTTP/2 — không cần phải lần lượt.

Test Runner — Drop-in Replacement Cho Jest#

import { describe, it, expect, mock } from 'bun:test';

describe('UserService', () => {
  it('should create user', async () => {
    const user = await createUser({ name: 'Alice' });
    expect(user.name).toBe('Alice');
  });
});
ts
bun test # Chạy test
bun test --watch # Watch mode
bun test --coverage # Coverage
bash

Built-in, không cần cấu hình. Nhanh hơn Jest ~10x vì không phải transform file qua Babel mỗi lần.

Bundler — Webpack/esbuild Thay Thế#

bun build ./src/index.ts --outdir ./dist
bash

Hỗ trợ:

  • TypeScript, JSX, CSS — out-of-the-box
  • Code splitting, tree shaking
  • Loader plugin API
  • Source maps

Performance: ~1.5x nhanh hơn esbuild, ~20x nhanh hơn Webpack.

Bun.serve — HTTP Server Built-in#

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response('Hello from Bun!');
  },
});
ts

Không cần Express, không cần hono — server HTTP chạy native từ runtime, xử lý ~300k request/giây.

Bun.file — File I/O Đơn Giản#

// Đọc file — một dòng
const file = Bun.file('data.json');
const json = await file.json();

// Ghi file
await Bun.write('output.txt', 'Hello');

// Stream
const stream = file.stream();
ts

Bun.sqlite — SQLite Built-in#

Không cần cài thư viện — Bun có SQLite sẵn:

const db = new Bun.SQLite(':memory:');
db.run(`
  CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)
`);
db.run('INSERT INTO users (name) VALUES (?)', ['Alice']);
const users = db.query('SELECT * FROM users').all();
ts

Migration Từ Node.js Sang Bun#

Phần lớn project Node.js chạy được ngay với Bun:

bun run index.ts # Chạy file TS trực tiếp (không cần ts-node)
bun run dev # Chạy npm script
bunx prisma generate # Bun thay thế npx
bash

Tương Thích Với Hệ Sinh Thái#

PackageNode.jsBunGhi chú
ExpressTương thích
FastifyTương thích
PrismaHỗ trợ chính thức
Next.jsBun runtime cho dev
Socket.IOTương thích
node:fsAPI tương thích 99%
node:httpAPI tương thích

Một số package dùng native addon (node-gyp) cần rebuild — nhưng con số này giảm dần khi Bun phát triển.

Bun Trong Thực Tế#

CICD — Giảm 60% Thời Gian Build#

# GitHub Actions với Bun
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun test
- run: bun run build
yaml

Các project lớn như Vercel, Cloudflare đều hỗ trợ Bun trong pipeline từ 2025.

Serverless — Cold Start Ấn Tượng#

Bun khởi động nhanh gấp 4x Node.js — lý tưởng cho serverless function (Lambda, Cloudflare Workers). Cold start từ ~800ms (Node) xuống ~200ms (Bun).

Workspace Monorepo#

bun run --filter=@app/* test
bash

Quản lý monorepo không cần Turborepo/Nx — Bun workspace built-in hoạt động mượt.

Bun So Sánh Với Deno#

Tiêu chíBunDeno
EngineJavaScriptCoreV8
Ngôn ngữZigRust
Package managerBuilt-innpm (third-party)
Test runnerBuilt-inBuilt-in
BundlerBuilt-inKhông
Node compat~90%~95%
Lockfilebun.lockdeno.lock

Deno mạnh về security (permission system), Bun mạnh về tốc độ và tích hợp.

Hạn Chế (2026)#

Dù đã rất tiến bộ, Bun vẫn có điểm yếu:

  • Native addon: Một số package C++ addon chưa compatible
  • Windows: Chạy được nhưng chưa mượt bằng macOS/Linux
  • Ecosystem depth: Một số tool niche chưa test đầy đủ trên Bun
  • Production tracking: Ít case study production quy mô lớn hơn Node

Kết Luận#

Bun không thay thế Node.js ngay lập tức — nhưng nó đặt ra chuẩn mới cho runtime JavaScript:

  • Tốc độ: Khởi động nhanh, thực thi nhanh
  • Tích hợp: Một binary thay cả npm + Jest + Webpack + Node
  • Tương thích: Chạy được code Node.js hiện có

Nếu bạn bắt đầu project mới, Bun là lựa chọn mặc định tốt. Với project cũ, có thể migrate dần — bắt đầu từ bun installbun test trước, khi thấy ổn thì chuyển hẳn sang bun run.

“Bun không làm JavaScript chạy nhanh hơn — nó làm developer chạy nhanh hơn.”

Tài liệu tham khảo#