· bun / nodejs / runtime

Bun 2026: thay đổi từ 1.0 và những lỗi migration hay gặp

Từ một runtime đầy tiềm năng đến nền tảng full-stack — Bun 1.2, 1.3, và thương vụ Anthropic đã thay đổi bài toán migration. Đây là những gì thực sự quan trọng.

Bởi

2.027 từ · 11 phút đọc

Bun không còn chỉ là một Node nhanh hơn. Nó đã tích hợp sẵn client cho Postgres, Redis, MySQL, và S3. Nó có frontend dev server. Nó chạy HTTP/3. Anthropic mua lại Bun vào tháng 12 năm 2025. Câu hỏi migration đã trở nên thú vị hơn bất kỳ lần bump major version nào trước đây.

Câu trả lời thẳng thắn: Bun thắng cho serverless greenfield, CLI tooling, và vòng lặp install monorepo. Với các production service hiện tại, quyết định phụ thuộc vào mức độ bao phủ test của bạn và liệu bạn có gặp phải một trong sáu gotcha được ghi lại dưới đây hay không.

Bài này dành cho ai

Engineer đang cân nhắc có nên adopt hoặc migrate sang Bun trong năm 2026. Nếu bạn vẫn đang dùng Bun 1.0 hoặc 1.1 từ hai năm trước, bạn đang chạy một sản phẩm khác về cơ bản — hầu hết các built-in client chưa tồn tại lúc đó.

Bỏ qua xuống Những điểm dễ gây lỗi khi migrate nếu bạn đã biết câu chuyện của Bun.

Nếu bạn muốn so sánh trực tiếp với các runtime khác, xem Bun vs Node.jsBun vs Deno.

Bun thay đổi gì từ 1.0 đến 1.3.14

Bun 1.2 (tháng 1 năm 2025)

Đây là bản release đánh dấu bước chuyển của Bun từ “Node nhanh hơn” sang “full-stack runtime.”

  • Native Postgres client: import { sql } from "bun" với parameterized query, không cần cài driver. Client được tối ưu cho latency — connection setup thực hiện bằng native code và được tái sử dụng giữa các request.
  • Native S3 client: import { s3 } from "bun", sau đó s3.file("folder/key") để đọc và ghi dạng stream. File interface giống với Bun.file() nên mental model dễ chuyển đổi.
  • CSS bundler: Bun.build() giờ xử lý được cả .css cùng JS/TS. Một bundler cho toàn bộ app.
  • HTTP/2 server: ra mắt trong 1.2.
  • Bytecode caching: runtime giờ cache bytecode đã compiled xuống disk, giảm cold start khi chạy lại.
  • Text lockfile: bun.lock giờ là plain text dễ đọc. Diff trong PR cuối cùng cũng có ích.

Bun 1.3 (tháng 10 năm 2025)

  • Frontend dev server: HMR, asset serving, và TypeScript compilation — khởi động bằng cách truyền thẳng một HTML entry point vào bun. Đối tượng mục tiêu là ai đang chạy webpack-dev-server hoặc Vite trong development — không thay thế production bundler, nhưng là vòng lặp phát triển nhanh hơn.
  • Native MySQL client: bổ sung vào cùng Postgres và SQLite (đã native từ trước), hoàn thành bộ ba relational.
  • Native Redis client: import { redis } from "bun" với hỗ trợ pipeline và pub/sub.
  • Parameterized routes: Bun.serve({ routes: { "/user/:id": handler } }) — không cần routing library cho các service đơn giản.
  • Tương thích Node.js: hơn 800 test bổ sung trong bộ test Node.js được pass. Bề mặt tương thích mở rộng đáng kể.

Bun 1.3.14 (tháng 5 năm 2026)

  • HTTP/2 client (experimental): fetch() được bổ sung HTTP/2, nhưng vẫn là experimental và cần bật thủ công — CLI flag --experimental-http2-fetch, env var BUN_FEATURE_FLAG_EXPERIMENTAL_HTTP2_CLIENT=1, hoặc tùy chọn từng request fetch(url, { protocol: "http2" }). Chưa bật mặc định.
  • Bun.Image: API xử lý ảnh native (resize, convert, encode/decode). Thay thế trực tiếp cho sharp trong nhiều trường hợp.
  • Warm install nhanh hơn 7×: package manager tái sử dụng local cache tích cực hơn khi [install] globalStore = true được set trong bunfig.toml (tắt mặc định). Trên fixture ~1.400 package đo bằng hyperfine --warmup 3 --runs 10, thời gian warm install giảm từ 841ms xuống còn ~115ms (~7×).

Thương vụ Anthropic (tháng 12 năm 2025)

Jarred Sumner công bố Bun gia nhập Anthropic vào tháng 12 năm 2025. Điều khoản đã nêu: tiếp tục MIT-licensed, giữ nguyên team, Anthropic cung cấp infrastructure và vốn. Hệ quả thực tế: CI nhanh hơn, nhịp release tăng lên, và việc phát triển các native client library (Postgres, Redis, MySQL, S3, HTTP/3) được đẩy mạnh hơn.

Với mục đích adoption production, điều này giải quyết rủi ro “điều gì xảy ra với dự án OSS một nhà cung cấp nếu nguồn tiền cạn kiệt?” Nhưng nó đặt ra một câu hỏi khác: Anthropic là công ty AI, không phải công ty developer-tools. Alignment của roadmap có thể dần lệch trong vòng hai năm tới.

Hiệu năng: ý nghĩa thực sự của các con số

Các con số benchmark về Bun đòi hỏi một lưu ý về phương pháp vì khoảng cách giữa benchmark tổng hợp và production là có thật và lớn.

Nơi Bun thắng rõ ràng

WorkloadBunNodeGhi chú
bun install (cold, 500 packages)~3s~75s (npm)Nhanh hơn 25×
bun install (warm cache, 1.3.14, globalStore=true)~115msNhanh hơn ~7× so với trước 1.3.14
Lambda cold start (HTTP server tối giản)~290ms~940msNhanh hơn 69%
Test runner (TypeScript test suite, không build)Nhanh hơn ~2–5×baselineBỏ qua bước build
Script startup8–15ms60–120msOverhead mỗi tiến trình

Lambda cold start là case production thuyết phục nhất. Với function được gọi không thường xuyên, 290ms so với 940ms là sự khác biệt người dùng cảm nhận được. Xem so sánh Cloudflare Workers vs AWS Lambda để phân tích chi tiết về chi phí và latency theo platform.

Tốc độ install package là thật và tích lũy theo ngày. Nếu bạn chạy bun install hai mươi lần trong một ngày làm việc, bạn tiết kiệm được vài phút, không phải vài giây.

Nơi khoảng cách thu hẹp

HTTP throughput trên benchmark tổng hợp cho thấy Bun cải thiện 2.8×. HTTP throughput trên các CRUD service thực tế — nơi phần lớn thời gian dành để chờ database — cho thấy cải thiện khoảng 3%. Con số 2.8× là đo throughput UV loop, không phải đo end-to-end application.

Đây không phải vấn đề riêng của Bun. Đó là cách benchmark runtime vốn dĩ hoạt động. Cần biết mình đang đọc loại benchmark nào.

Những điểm dễ gây lỗi khi migrate

Sáu gotcha migration từ nguồn gốc, sắp xếp theo mức độ thường gặp:

1. Hành vi experimentalDecorators thay đổi trong một patch release

Một bản patch 1.2.x đã thay đổi cách experimentalDecorators hoạt động khi kết hợp với useDefineForClassFields. Nếu bạn dùng decorator (NestJS, TypeORM, Angular), pin phiên bản Bun trong CI và test kỹ khi upgrade.

Cách xử lý: lock BUNVERSION=1.x.y trong CI image. Đừng pin vào latest.

2. Native addon target Node ABI trực tiếp có thể segfault

better-sqlite3 và một số library xử lý PDF target Node C++ ABI và kỳ vọng layout V8 embedding của Node. Bun dùng JavaScriptCore, và compatibility shim không bao phủ hết tất cả pattern native addon. Failure mode là segfault, không phải error.

Cách xử lý: thay better-sqlite3 bằng built-in SQLite của Bun (import { Database } from "bun:sqlite"). Với các native addon khác, kiểm tra Bun Node compatibility tracker trước khi migrate.

3. Thứ tự ưu tiên auto-loading .env khác với dotenv

Bun tự load file .env mà không cần dotenv. Thứ tự ưu tiên khác: .env.local được ưu tiên hơn .env, và mặc định không có loading .env.production theo NODE_ENV. Nếu app của bạn phụ thuộc vào thứ tự load của dotenv, hành vi sẽ thay đổi khi migrate.

Cách xử lý: đặt --env-file tường minh hoặc kiểm tra cấu trúc .env của bạn theo thứ tự load mà Bun đã ghi lại.

4. Jest compatibility — không phải thay thế trực tiếp

Một migration thực tế được ghi lại (dev.to) cần viết lại 60 trong số 420 test khi chuyển từ Jest sang bun test. Mocking API khác. Timer mock khác. jest.mock() không tồn tại.

Cách xử lý: dành ngân sách thời gian để viết lại test suite trước khi cam kết migration. Chạy bun test với Jest test hiện tại của bạn trước — các lỗi sẽ phơi bày khoảng cách.

5. __dirname__filename trong ESM

Trong Node ESM ("type": "module"), __dirname__filename không được định nghĩa. Bun định nghĩa chúng vì lý do tiện lợi, nghĩa là code chạy được trong Bun ESM có thể không chạy được trong Node ESM. Nếu bạn ship library, đây là lỗi portability.

Cách xử lý: dùng import.meta.dirnameimport.meta.filename thay thế. Cả hai đều hoạt động trên cả hai runtime.

6. node:crypto createCipheriv có sự khác biệt nhỏ

Bản triển khai node:crypto của Bun pass hầu hết test tương thích, nhưng có các edge case được ghi lại trong createCipheriv và các streaming cipher API liên quan. Nếu code của bạn dùng trực tiếp (không qua abstraction của library), hãy test kỹ.

Cách xử lý: chạy code liên quan đến crypto của bạn với bộ test của Bun. Nếu bạn đang dùng library như jose hoặc jsonwebtoken, chúng đã được test với Bun và thường an toàn.

Verdict

Dùng Bun cho:

  • Serverless function greenfield — cải thiện Lambda cold start đã đủ để biện hộ
  • Internal tooling và CLI — tốc độ startup, TypeScript ngay từ đầu, không cần toolchain thêm
  • Monorepo — tốc độ install và workspace support thực sự tốt hơn
  • Service mới muốn dùng built-in Postgres/Redis/MySQL mà không cần driver package

Cẩn thận với Bun nếu:

  • Bạn có production service dùng nhiều native addon (kiểm tra node_modules có file .node native không trước khi migrate)
  • Bạn có test suite Jest lớn với mocking phức tạp — hãy dự tính thời gian viết lại
  • Tổ chức của bạn cần LTS contract rõ ràng (Bun chưa có LTS policy tính đến tháng 5 năm 2026)

Câu hỏi về thương vụ Anthropic:

Với hầu hết developer: trung tính đến tích cực. Dự án được tài trợ tốt hơn, MIT license được xác nhận, team không đổi. Rủi ro lệch roadmap dài hạn là có thật nhưng còn mang tính suy đoán.

Với doanh nghiệp: sự thay đổi từ dự án OSS độc lập sang công ty con của Anthropic đáng được ghi nhận trong vendor assessment, nhưng không phải lý do để từ chối — Anthropic không sắp đi đến đâu.

Lưu ý

Các con số benchmark trong bài này đến từ nguồn gốc (blog post bun.sh và xác nhận từ cộng đồng). toolchew chưa thực hiện đo hiệu năng độc lập — các con số này có sự đồng thuận từ nhiều nguồn báo cáo độc lập.

Sáu gotcha đến từ GitHub Issues, bài viết cộng đồng, và ghi chép migration. Chúng là các lỗi đã được ghi lại và có thể tái hiện — không phải lo ngại lý thuyết.

Bài này có chứa affiliate link đến Cloudflare Workers. toolchew độc lập sử dụng và giới thiệu Cloudflare Workers cho việc deploy Bun. Mối quan hệ affiliate không ảnh hưởng đến verdict.

Deploy ứng dụng Bun của bạn

Bun trên Cloudflare Workers cho bạn cold start nhanh nhất trong platform (Workers đã có cold start thấp; overhead startup của Bun thu hẹp khoảng cách hơn nữa). Mô hình pricing của Workers — 100K request/ngày miễn phí, sau đó $0.50 mỗi triệu — phù hợp với pattern “nhiều function nhỏ” mà Bun cho phép.

Deploy ứng dụng Bun của bạn trên Cloudflare Workers →

Vercel cũng hỗ trợ Bun runtime thông qua flag bun trong vercel.json. Đáng lưu ý nếu bạn đã dùng Vercel platform. Xem so sánh Cloudflare Workers vs Vercel Edge nếu bạn đang cân nhắc giữa hai lựa chọn.

Tham khảo