- Bun 1.2 (2026) chạy Next.js 15 nhanh hơn Node.js 22: install nhanh 10-20x, start dev 3-5x, runtime 1.5-2x ở route đơn giản.
- VPS 2GB Ubuntu chạy ngon Bun + Next.js. Cài 1 dòng curl.
- Một số native module chưa tương thích 100% (sharp, canvas, một số adapter Prisma cũ). Test trước khi switch.
- Sweet spot: API server đơn giản, SSR Next.js, microservice TypeScript. Tránh dùng cho legacy heavy native deps.
- Cold start container giảm 40-60%, hợp serverless self-host (Coolify, Dokploy).
Bun 1.0 ra mắt 2023, đến 2026 đã v1.2 với độ ổn định production. Quảng cáo "nhanh hơn Node.js 2-3x" - thực tế thế nào? Bài này benchmark Bun vs Node trên VPS Ubuntu thật, chạy Next.js 15, API Hono, SSR React, build/install/start. Kết quả không phải tất cả màu hồng nhưng đủ thuyết phục để switch nhiều use case.
Mình đã chuyển 3 dự án từ Node sang Bun trong 6 tháng: SaaS dashboard Next.js, API REST Hono, ETL Python wrapper. Bài này chia sẻ kết quả thực tế, lỗi gặp phải, cách workaround. Phù hợp dev VN đang băn khoăn switch runtime.
Mục tiêu cuối bài: bạn biết khi nào nên switch sang Bun, khi nào stick với Node, cách cài trên VPS Ubuntu, mẹo CI/CD và Docker production.
1. Bun là gì và khác Node ở điểm nào?
Bun là all-in-one JavaScript runtime + package manager + bundler + test runner. Viết bằng Zig (C-like), dùng JavaScriptCore engine (Safari) thay vì V8 (Chrome). Thiết kế focus: tốc độ và DX.
| Tính năng | Node.js 22 | Bun 1.2 |
|---|---|---|
| Engine | V8 | JavaScriptCore |
| Package manager | npm (separate) | bun (built-in) |
| Bundler | esbuild/webpack ngoài | bun build native |
| TypeScript native | Cần ts-node hoặc tsx | Run .ts trực tiếp |
| Test runner | vitest/jest ngoài | bun test |
| HTTP server | http module | Bun.serve native |
| Hot reload | nodemon | --hot built-in |
Bun gộp 5-6 tool thường dùng vào 1 binary. Giảm dev dependencies, giảm config, giảm bundle size container.
2. Cài Bun trên VPS Ubuntu
# SSH vào VPS
ssh [email protected]
# Cài Bun (1 dòng)
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc
# Kiểm tra
bun --version
# 1.2.xBun cài vào ~/.bun/bin/, thêm vào PATH. Không cần root. Có thể cài song song với Node 22 - chạy node và bun độc lập. Khuyến nghị giữ cả hai trong giai đoạn migrate.
3. Benchmark install dependencies
Test trên project Next.js 15 mới create với 280 dependencies trong package.json. VPS Cloud TND Pro 4GB Ubuntu 24.04.
| Command | Cold install | Warm (cache) | Disk used |
|---|---|---|---|
| npm install | 92s | 28s | 520MB |
| pnpm install | 38s | 11s | 180MB (symlink) |
| bun install | 8s | 2s | 490MB |
Bun nhanh hơn npm 11x cold, 14x warm. Lý do: parallel download, no script execution by default, binary linker thay vì JS resolver. Đây là lý do mạnh nhất để switch package manager sang Bun ngay (kể cả khi vẫn dùng Node runtime).
4. Benchmark Next.js dev start
# Test: time from "bun dev" to "ready in Xms"
# Next.js 15 App Router, 50 component, Tailwind
# Node 22
npm run dev # ready in 4.2s
# Bun 1.2
bun dev # ready in 1.1sBun start dev nhanh 3.8x. HMR (hot reload) khi sửa file cũng nhanh hơn ~30%. Cảm giác dev rất khác - thay đổi code thấy gần như instant.
5. Benchmark Next.js production build
| Command | Build time | RAM peak | Output size |
|---|---|---|---|
| npm run build (Node) | 58s | 1.4GB | 120MB |
| bun run build | 32s | 1.1GB | 120MB |
Bun chạy script build qua Node (Next.js dùng webpack/turbopack) nên speedup chủ yếu từ bun execution. Khi Turbopack stable trong Bun (đang work in progress), kỳ vọng giảm tiếp 30%.
6. Benchmark runtime: API server Hono
Test với wrk: API trả JSON tĩnh, 100 concurrent connection, 30s.
| Stack | req/s | p99 latency | RAM |
|---|---|---|---|
| Node 22 + Hono + node:http | 42000 | 8ms | 85MB |
| Bun 1.2 + Hono + Bun.serve | 118000 | 3ms | 62MB |
| Fastify + Node 22 | 48000 | 7ms | 92MB |
Bun.serve nhanh gấp 2.8x Node + Hono cho API tĩnh. Khi có DB query, gap thu hẹp vì bottleneck là DB. Nhưng kể cả 30-40% nhanh hơn cũng đáng cho high-traffic API.
7. Compatibility với npm packages
Bun claim 95% compat với Node API. Thực tế 2026:
- Express, Fastify, Hono, Koa: chạy OK.
- Next.js 14/15: chạy OK với bun dev và bun run build.
- Prisma 5+: chạy OK. Phiên bản <5.5 có issue với adapter.
- sharp (image processing): hoạt động nhưng cần build native. Cài lâu hơn npm.
- node-canvas: still has issue, dùng @napi-rs/canvas thay thế.
- puppeteer, playwright: chạy OK.
- Một số ORM cũ (Sequelize 6.0): có warning, không lỗi.
Quy tắc: thử bun install trước, chạy bun dev xem có lỗi không. 90% project Next.js mới chạy ngay. Legacy project Express với native module cũ cần test kỹ.
8. Dockerfile production với Bun
# Dockerfile
FROM oven/bun:1.2-alpine AS base
WORKDIR /app
# deps stage
FROM base AS deps
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production
# build stage
FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN bun run build
# runtime
FROM base
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["bun", "start"]Image final ~180MB (vs Node alpine ~250MB). Cold start container giảm từ 800ms xuống 320ms. Quan trọng cho serverless self-host.
9. CI/CD với Bun
# .github/workflows/ci.yml
name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2
- run: bun install --frozen-lockfile
- run: bun test
- run: bun run buildCI pipeline thường giảm 40-60% thời gian khi switch sang Bun. Test trên project nhỏ: pipeline từ 4 phút xuống 1.5 phút. Tiết kiệm minute GitHub Actions, tăng tốc development cycle.
10. PM2 / systemd cho production
# /etc/systemd/system/nextjs-bun.service
[Unit]
Description=Next.js app with Bun
After=network.target
[Service]
Type=simple
User=app
WorkingDirectory=/var/www/myapp
ExecStart=/home/app/.bun/bin/bun start
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.targetSystemd unit chạy Bun service. Reload tự động khi crash. Logs qua journalctl -fu nextjs-bun. Đơn giản hơn PM2 và không cần Node process manager.
11. Khi nào KHÔNG nên dùng Bun?
- Project dùng native module cũ (node-canvas, node-sass legacy, một số native crypto).
- Worker thread heavy: API Bun chưa stable bằng Node.
- Đang dùng Cluster mode multi-process: Bun có nhưng API khác Node.
- Team chưa quen TypeScript runtime, debug khó hơn.
- Production critical chạy nhiều năm với Node: chi phí migrate cao, ROI không rõ.
12. Use case sweet spot
- Project Next.js/Remix/SvelteKit mới start: Bun ngay từ đầu.
- API microservice Hono/Elysia trên VPS nhỏ (1-2GB): nhẹ, nhanh, RAM thấp.
- Script CLI internal: bun run *.ts không cần tsx/ts-node.
- Monorepo Turborepo: workspace native support, install siêu nhanh.
- CI/CD lint/test: thay thế npm + jest, giảm 50% thời gian.
VPS chạy Bun + Next.js production siêu nhanh
Cloud VPS TND AMD EPYC AVX-512, SSD CEPH NVMe, snapshot 1-click, backup hằng ngày, network 200Mbps. CPU mới tận dụng Bun JavaScriptCore tối ưu SIMD, container Bun cold start dưới 400ms, ROI cao cho serverless self-host (Coolify, Dokploy).
Xem 8 cấu hình Cloud VPS →FAQ
Bun có chạy được Next.js 14/15 không?
Có. Next.js 14+ chạy ngon với Bun từ v1.1. Cả dev mode lẫn production build đều stable. Vercel dù không officially support Bun runtime trên server-side production, nhưng bun install + bun run build dùng Node để run vẫn ổn. Self-host Bun start production cũng OK.
Có nên switch toàn bộ project sang Bun?
Tuỳ. Project mới: switch ngay vì gain lớn không có cost migrate. Project cũ ổn định production lâu năm: chỉ migrate package manager (bun install thay npm install) trước, runtime giữ Node cho safe. Sau 3-6 tháng test, mới migrate runtime nếu thấy ổn.
Bun có hỗ trợ ESM và CommonJS cùng lúc?
Có, tốt hơn Node. Trong một file Bun có thể import ESM và require CJS lẫn nhau không cần config. Node yêu cầu type:module hoặc .mjs/.cjs phân biệt. Bun auto-detect, giảm headache khi mix dependency cũ và mới.
Bun có memory leak không?
v1.0 từng có leak với long-running process. Từ v1.1+ đã fix nhiều. Mình chạy Bun production 6 tháng, restart container 1 tuần 1 lần (best practice anyway), không thấy memory grow bất thường. Vẫn nên monitor với metric Prometheus, alert khi RSS > threshold.
Bun có replace npm cho monorepo Turborepo không?
Có. Turborepo 2.x official support bun workspace. Khai báo workspaces trong package.json, bun install symlink dependencies giữa các package. Tốc độ install 10x nhanh hơn npm workspaces. pnpm vẫn nhỉnh ở phương diện disk save (hardlink), nhưng tốc độ Bun thắng.
Cách debug Bun script với VS Code?
Bun có inspect protocol giống Node. launch.json: {"type":"node","request":"launch","runtimeExecutable":"bun","program":"src/index.ts","args":["--inspect-brk"]}. Breakpoint VS Code hoạt động. Source map TypeScript native, không cần config thêm.



