· elysia / hono / bun

Elysia vs Hono — Chọn framework server Bun-native năm 2026

Hono là lựa chọn mặc định cho Cloudflare Workers và đa runtime. Elysia dành cho Bun exclusive với Eden Treaty — type-safe RPC client không cần code generation.

Bởi

1.985 từ · 10 phút đọc

Chọn Hono nếu bạn triển khai lên Cloudflare Workers, cần một framework chạy giống nhau trên Node.js, Deno và Bun, hoặc muốn có ecosystem và cộng đồng lớn nhất. Chọn Elysia nếu bạn dùng Bun exclusively và muốn Eden Treaty — một RPC client type-safe end-to-end, không cần code generation và không trùng lặp schema.

Bài này dành cho ai

Developer TypeScript đang chọn HTTP framework cho backend Bun trong năm 2026. Nếu bạn vẫn đang dùng Node.js và chưa có kế hoạch chuyển đổi, bài này chưa liên quan — Hono chạy tốt trên Node.js nhưng Elysia ưu tiên Bun. Nếu bạn đang cân nhắc có nên dùng Bun không, hãy đọc Bun vs Node trước. Nếu bạn đang xem xét Hono như một bước chuyển từ Express sang TypeScript-first, xem Hono vs Express trước.

Chúng tôi so sánh gì

Elysia v1.4 (có CF Workers adapter) so với Hono v4.12. Chúng tôi viết các endpoint tương đương trên cả hai framework để so sánh API shape, TypeScript ergonomics và client generation. Benchmark không phải do chúng tôi tự đo — các con số thô không qua được kiểm chứng từ bất kỳ nguồn nào chúng tôi kiểm tra. Để biết dữ liệu throughput hiện tại, hãy xem trực tiếp bun-http-framework-benchmark. Nhìn tổng quan về hiệu suất: cả hai framework đều nhanh cho Bun HTTP. Không framework nào là bottleneck trong thực tế.

Bảng so sánh nhanh

Tiêu chíElysiaHono
Runtime chínhBunBun, Node.js, Deno, CF Workers, Vercel Edge
Cloudflare WorkersExperimental (CloudflareAdapter + .compile())Sẵn sàng production, được Cloudflare khuyến nghị
Type-safe clientEden Treaty (không codegen, Bun-first)hc<AppType>() (hoạt động cross-runtime)
GitHub stars (tháng 5/2026)18,41830,678
npm ecosystem / middlewareNhỏ hơn, plugin Bun-nativeLớn hơn, nhiều middleware bên thứ ba hơn
Tốc độ TypeScript inferenceNhanh hơn 82% (self-reported, Elysia 1.0)Cải thiện từ v4.10.0
ValidationTích hợp sẵn (t.* qua TypeBox)Tự chọn (Zod, Valibot, …)

Elysia

Elysia được xây dựng cho Bun ngay từ đầu. Mô hình lập trình của Elysia coi validation và type inference là một — bạn định nghĩa schema bằng các helper t.* (TypeBox bên dưới), và TypeScript tự động suy ra input types cho handler từ những định nghĩa đó. Không cần gọi .parse() riêng. Không còn độ lệch giữa runtime validation và compile-time types.

Tính năng nổi bật là Eden Treaty: một client library suy ra API surface từ server type của bạn qua treaty<typeof app>(url). Bạn có autocompletion, typed request body và typed response mà không cần chạy code generator hay duy trì file schema riêng. Nếu bạn đang xây dựng monorepo với frontend và backend chia sẻ package, Eden Treaty loại bỏ hoàn toàn một nhóm bug liên quan đến type drift.

Elysia 1.3 mang lại các cải thiện hiệu suất đáng kể. Đăng ký route nhanh hơn khoảng 2.7× với bộ nhớ ít hơn khoảng 5.6×. Tạo plugin nhanh hơn khoảng 3× với bộ nhớ ít hơn khoảng 10×. Throughput normalization tăng từ khoảng 49k lên 77k req/s trong benchmark nội bộ của họ. Đây là các con số self-reported — hãy xem như chỉ số định hướng, không phải tuyệt đối.

Hai thay đổi trong 1.3 cần biết trước khi nâng cấp:

Hàm error() đã bị deprecated, thay thế bởi status(). Tên cũ vẫn hoạt động hiện tại nhưng sẽ bị xóa khoảng v1.4–1.5. Hãy cập nhật error handlers của bạn.

Hậu tố .index trong Eden Treaty đã bị xóa. Nếu client code của bạn gọi app.users.index.get(), giờ là app.users.get(). Đây là breaking change cho các Eden client hiện tại.

Cần chú ý: Hỗ trợ Cloudflare Workers vẫn được đánh dấu experimental tính đến v1.4.7. Nó yêu cầu CloudflareAdapter, một lệnh gọi .compile() bắt buộc trước khi export, và compatibility_date: "2025-06-01" trở lên trong wrangler.toml. Static file serving không hoạt động (không có module fs). Nếu CF Workers là mục tiêu triển khai thực sự — không chỉ là phương án dự phòng — thì đừng phụ thuộc vào path này chưa.

import { Elysia, t } from 'elysia'

const app = new Elysia()
  .get('/health', () => ({ ok: true }))
  .post('/users', ({ body }) => ({ id: 1, ...body }), {
    body: t.Object({
      name: t.String(),
      email: t.String({ format: 'email' }),
    }),
  })
  .listen(3000)

export type App = typeof app
// Client — cùng monorepo, không cần codegen
import { treaty } from '@elysiajs/eden'
import type { App } from '../server'

const client = treaty<App>('http://localhost:3000')
const { data } = await client.users.post({ name: 'Alice', email: '[email protected]' })

Hono

Lợi thế cốt lõi của Hono là tính linh hoạt về runtime. Một định nghĩa app duy nhất chạy được trên Cloudflare Workers, Node.js, Bun, Deno, Vercel Edge, Netlify Edge và AWS Lambda — không cần adapter flag hay lệnh compile. Cloudflare liệt kê Hono trong danh sách framework được hỗ trợ chính thức. Nếu deployment target của bạn là Cloudflare Workers, Hono là lựa chọn hiển nhiên.

API của Hono được giữ tối giản một cách có chủ đích. Cú pháp định nghĩa route trông giống Express, middleware tuân theo pattern (c, next), và bạn tự chọn validation library. Đây là ưu điểm, không phải thiếu sót — Zod, Valibot và ArkType đều tích hợp gọn, và bạn không bị khóa vào TypeBox.

RPC client của Hono (hc<AppType>(url)) làm điều tương tự như Eden Treaty: suy ra client type từ định nghĩa server. Nó yêu cầu dùng app.route() để expose types đúng cách, tạo thêm một ít overhead về cấu trúc mà Eden Treaty không có. Từ v4.10.0 trở đi, middleware types được truyền đúng qua chain — đây từng là một điểm yếu tồn tại lâu.

Lợi thế ecosystem là thực. Hono có nhiều community middleware hơn, nhiều integration hơn (Sentry, Stripe webhooks, JWT, rate-limiting), và nhiều câu trả lời trên Stack Overflow hơn. Với team nhỏ cần ship nhanh mà không có kiến thức framework sâu, độ rộng đó có giá trị thực sự.

Cần chú ý: Hono không có validation tích hợp sẵn. Gọi c.req.json() trả về any. Bạn cần kết nối một validator middleware (package Zod validator là first-party, được Hono team duy trì) để có typed, validated bodies. Đây là setup hai bước mà Elysia xử lý trong một.

import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'

const app = new Hono()

app.get('/health', (c) => c.json({ ok: true }))

app.post(
  '/users',
  zValidator('json', z.object({ name: z.string(), email: z.string().email() })),
  (c) => {
    const body = c.req.valid('json') // typed
    return c.json({ id: 1, ...body })
  }
)

export default app
export type AppType = typeof app
// Client
import { hc } from 'hono/client'
import type { AppType } from '../server'

const client = hc<AppType>('http://localhost:3000')
const res = await client.users.$post({ json: { name: 'Alice', email: '[email protected]' } })
const data = await res.json()

So sánh trực tiếp

Type-safe client

Cả hai client đều dùng được. Eden Treaty của Elysia có cú pháp gọi phẳng hơn — client.users.post(body) — và không cần import riêng một validator package. hc client của Hono phản ánh HTTP method naming convention rõ ràng hơn (.$post(), .$get()), một số team thích điều này vì dễ đọc.

Tốc độ inference của Eden Treaty nhanh hơn (lên đến 13× theo IDE benchmark self-reported của Elysia 1.0) — đáng kể nếu IDE của bạn chậm với type graph lớn. Inference của Hono đúng từ v4.10.0 nhưng không công bố con số về tốc độ.

Một điểm khác biệt thực tế: client của Elysia ưu tiên Bun. Nếu frontend của bạn chạy trên browser hoặc runtime khác, bạn cần @elysiajs/eden phía client và nó phải có thể import server type. Trong monorepo đây là tiêu chuẩn. Trong setup đa ngôn ngữ thì cần có sự phối hợp. hc của Hono nhắm đến sử dụng cross-runtime ngay từ đầu.

DX của validation

Schema t.* tích hợp sẵn của Elysia ít ma sát hơn cho các dự án mới. Một package, một import, một lần gọi. Tích hợp TypeBox đồng nghĩa cùng một schema object vừa điều khiển runtime validation, vừa điều khiển TypeScript inference.

Cách tiếp cận của Hono linh hoạt hơn. Bạn có thể đổi Zod sang Valibot, dùng validator khác nhau trên các route khác nhau, hoặc bỏ qua validation hoàn toàn trên route nội bộ khi hiệu suất quan trọng hơn. Sự linh hoạt đó có chi phí về setup — bạn phải ghép hai package lại thay vì một.

Cloudflare Workers

Đây là điểm khác biệt rõ ràng nhất. Hono: không có cảnh báo, sẵn sàng cho production, được Cloudflare xác nhận. Elysia: experimental, với các hạn chế đã được ghi nhận (không có static file serving, không thể tạo Response trước khi start). Nếu CF Workers trong phạm vi kế hoạch, đây chính là yếu tố quyết định.

Cộng đồng và ecosystem

Hono có 30,678 GitHub stars so với 18,418 của Elysia (tháng 5/2026). Nhiều star hơn không đảm bảo framework tốt hơn, nhưng tương quan với nhiều câu hỏi Stack Overflow được trả lời hơn, nhiều plugin bên thứ ba được duy trì hơn, và xác suất thấp hơn rằng dự án sẽ bị bỏ rơi. Elysia cũng đang tăng trưởng — framework đang hoạt động tốt và SaltyAom release thường xuyên — nhưng khoảng cách là có thật.

Khi nào chọn cái nào

Chọn Elysia nếu:

  • Bạn dùng Bun exclusively, không có kế hoạch chạy trên Node.js hay CF Workers.
  • Bạn đang xây dựng monorepo với frontend và backend chia sẻ types, và muốn RPC client zero-codegen của Eden Treaty.
  • Validation tích hợp sẵn với một package đáng giá hơn độ rộng của ecosystem.
  • Bạn thoải mái với việc cập nhật kịp thời — Elysia ship breaking changes, và 1.3 đã deprecated error() rồi.

Chọn Hono nếu:

  • Cloudflare Workers là deployment target, dù chỉ trong tương lai.
  • Bạn cần server chạy trên Node.js, Deno hoặc runtime khác ngoài Bun.
  • Bạn muốn ecosystem lớn hơn, nhiều middleware hơn, hoặc nhiều tài nguyên cộng đồng hơn.
  • Bạn muốn tách biệt lựa chọn validation library khỏi lựa chọn framework.

Kết luận

Với hầu hết team bắt đầu dự án Bun mới trong năm 2026, Hono là lựa chọn an toàn hơn. Câu chuyện CF Workers của Hono vững chắc, hỗ trợ đa runtime đồng nghĩa bạn không bị khóa vào một nơi, và 30k stars có nghĩa là bạn sẽ tìm được câu trả lời khi gặp khó khăn. Chi phí setup validator thêm chỉ là một lần.

Elysia là lựa chọn đúng khi bạn biết mình sẽ gắn với Bun và muốn type-safe client của Eden Treaty mà không cần bất kỳ nghi lễ nào. Nếu bạn đã dùng thử hc client của Hono và thấy cú pháp .$post() / .$get() cồng kềnh, call shape của Elysia thực sự thoải mái hơn. Hãy nhớ các breaking change trong 1.3 và CF Workers adapter đang experimental trước khi cam kết.

Lưu ý

Chúng tôi không tự benchmark cả hai framework. Các con số hiệu suất trong phần Elysia là self-reported từ đội ngũ Elysia. Để so sánh throughput độc lập, hãy xem bun-http-framework-benchmark và chạy suite trên phần cứng của bạn. Bài viết này có chứa affiliate links.

Tài liệu tham khảo

  1. Eden Treaty overview — elysiajs.com
  2. Elysia 1.0 release blog
  3. Elysia 1.3 release blog
  4. Elysia Cloudflare Worker integration
  5. Hono RPC guide
  6. Hono Cloudflare Workers guide
  7. Hono v4.10.0 release — middleware type fix
  8. bun-http-framework-benchmark
  9. Cloudflare Workers framework guides — Hono