Bun runtime trên VPS: chạy Next.js nhanh hơn Node.js 2x?

Chia sẻ bài viết

Mục lục
TL;DR
  • 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ăngNode.js 22Bun 1.2
EngineV8JavaScriptCore
Package managernpm (separate)bun (built-in)
Bundleresbuild/webpack ngoàibun build native
TypeScript nativeCần ts-node hoặc tsxRun .ts trực tiếp
Test runnervitest/jest ngoàibun test
HTTP serverhttp moduleBun.serve native
Hot reloadnodemon--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.x

Bun 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 nodebun độ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.

CommandCold installWarm (cache)Disk used
npm install92s28s520MB
pnpm install38s11s180MB (symlink)
bun install8s2s490MB

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.1s

Bun 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

CommandBuild timeRAM peakOutput size
npm run build (Node)58s1.4GB120MB
bun run build32s1.1GB120MB

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.

Stackreq/sp99 latencyRAM
Node 22 + Hono + node:http420008ms85MB
Bun 1.2 + Hono + Bun.serve1180003ms62MB
Fastify + Node 22480007ms92MB

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 build

CI 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.target

Systemd 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.
Cloud VPS cho vibe coder

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.

2009
15+ năm vận hành liên tục
10+
tập đoàn lớn tin dùng
100+
doanh nghiệp SMB Việt
30 ngày
đổi key lỗi miễn phí
Phần mềm bản quyền chính hãng chúng tôi cung cấp
Bản quyền chính hãng Hóa đơn VAT đầy đủ Đổi key lỗi 30 ngày Vận hành từ 2009 MST 0200994870 Hotline 0225.999.6666