· hono / express / nodejs

Hono vs Express — lựa chọn web framework Node.js năm 2026

Hono nhanh hơn, hỗ trợ TypeScript từ đầu, chạy trên mọi edge runtime. Express 5 ổn định, đã được kiểm chứng và có hệ sinh thái sâu hơn. Đây là cách chọn.

Bởi

2.596 từ · 13 phút đọc

Dùng Hono cho các dự án mới. Trải nghiệm TypeScript tốt hơn theo thiết kế, bundle nhỏ hơn 17 lần, và cùng một code chạy được trên mọi runtime. Chọn Express 5 nếu team bạn đã có nhiều năm với Express patterns, phụ thuộc vào middleware cụ thể chưa có bản tương đương trong Hono, hoặc đang duy trì một codebase Express đang hoạt động tốt mà không cần triển khai lên edge. Cả hai vẫn được duy trì tích cực. Chi phí migrate giữa chúng là có thật.

Bài này dành cho ai

Developer đang chọn server framework cho dự án mới, hoặc đang cân nhắc xem codebase Express có đáng migrate không. Nếu bạn đang dùng Fastify hoặc Koa và hài lòng, bài so sánh này sẽ không thay đổi quyết định của bạn.

Phiên bản được kiểm thử

Hono v4.12.25 (phát hành ngày 9 tháng 6 năm 2026) — 30.896 GitHub stars, 99,5% TypeScript codebase, không có external dependency nào.

Express v5.2.1 (phát hành ngày 1 tháng 12 năm 2025) — 69.142 GitHub stars, bản phát hành production được Technical Committee chính thức khuyến nghị, yêu cầu Node.js 18+.

Express 4 vẫn được hỗ trợ chính thức, nhưng quá trình phát triển tích cực đã chuyển sang Express 5. Nếu bạn vẫn đang dùng Express 4, hãy nâng cấp lên 5; các thay đổi đều có thể xử lý được và không có lý do gì để ở lại với Express 4.

Tại sao đây là thời điểm quan trọng để so sánh

Bốn năm trước, Hono chỉ có khoảng 1.000 lượt tải xuống npm mỗi tuần — một công cụ niche cho Cloudflare Workers. Tính đến tháng 6 năm 2026, con số đó đạt khoảng 20–35 triệu lượt mỗi tuần (khoảng dao động này phản ánh sự khác biệt giữa các công cụ đo lường, hãy kiểm tra npmtrends để có dữ liệu mới nhất). Express vẫn dẫn đầu với ~93–95 triệu lượt mỗi tuần, nhưng quỹ đạo tăng trưởng lại là một câu chuyện khác.

Lý do Hono tăng trưởng nhanh: kiến trúc của nó được xây dựng trên web-standard APIs (Fetch API). Cùng một code chạy không cần thay đổi trên Node.js, Bun, Deno, Cloudflare Workers, Vercel Edge, và Netlify Edge Functions. Express được xây dựng trên các primitive đặc thù của Node.js — http.IncomingMessage, Buffer, stream — vốn không có hoặc được emulate kém trên các edge runtime. Để chạy Express trên Cloudflare Workers cần dùng flag nodejs_compat, làm phình bundle vượt xa giới hạn kích thước của Workers. Về mặt thực tế, Express không thể chạy trên Workers.

Đây là sự thay đổi cấu trúc đằng sau đường cong tải xuống. Triển khai trên edge và serverless không còn là con đường niche nữa — đó là mặc định cho các dự án greenfield mới ở quy mô lớn. Hono được xây dựng cho thế giới đó. Express thì không.

So sánh trực tiếp

Hono v4.12.25Express v5.2.1
Bundle (gzipped)<14 KB~236 KB
External dependencies0Nhiều
TypeScriptFirst-class, đi kèm với packageQua @types/express (~57,4M lượt tải/tuần tính đến tháng 6 năm 2026)
Middleware tích hợp sẵn~233
Middleware bên thứ ba62 package chính thức dưới namespace @hono (tính đến tháng 6 năm 2026)Hàng nghìn
Edge runtimesTất cả các runtime chính, nativeChỉ Node.js (compat shim ở nơi khác)
Node.jsQua adapter @hono/node-serverNative
Lượt tải npm hàng tuần~20–35M~93–95M
GitHub stars30.89669.142

Hiệu năng

Hono nhanh hơn Express trên Node.js. Sự khác biệt không nhỏ.

Các benchmark cộng đồng liên tục cho thấy Hono xử lý được khoảng 4–5 lần số requests mỗi giây so với Express trong các kịch bản hello-world. Trên Bun, khoảng cách còn lớn hơn. Cần lưu ý thành thật: hầu hết các benchmark này không công bố thông tin về phần cứng, phiên bản công cụ, hay cài đặt concurrency. Hãy coi con số 4–5× là định hướng. Nó nhất quán đủ trong nhiều báo cáo độc lập để là một tín hiệu thực sự, không phải outlier được chọn lọc.

Những gì có thể xác minh từ nguồn gốc: trang benchmark của Hono cho thấy 402.820 ops/sec trên Cloudflare Workers so với 297.036 ops/sec của framework nhanh thứ hai chạy native trên Workers. Trên Deno (v1.22.0, M1 Pro, Hono v3.0.0), Hono đạt 136.112 req/sec so với các lựa chọn native trên Deno. Đây là Hono so với các framework hiện đại khác — không phải Hono so với Express, vì Express không thể chạy trong những môi trường đó.

Sự khác biệt về kích thước bundle quan trọng không kém hiệu năng thô. Preset hono/tiny của Hono ở dưới 12 KB với zero dependency. Express gzip xuống ~236 KB, nhưng bundle bạn thực sự triển khai lên môi trường Workers phình lên hơn 2 MB với các compat shim. Trên một V8 isolate với ngân sách 1 MB, con số này đã quyết định mọi thứ trước khi bạn viết một dòng code.

Riêng với Node.js thuần: khoảng cách hiệu năng hẹp lại vì Hono dùng adapter @hono/node-server thay vì kết nối trực tiếp vào HTTP primitive của Node. Lợi thế kiến trúc là có thật nhưng nhỏ hơn những gì benchmark edge thể hiện.

Hệ sinh thái middleware

Hono đi kèm ~23 middleware package tích hợp sẵn: CORS, JWT, rate limiting, CSRF protection, compression, caching, request logging, secure headers, basic auth, bearer auth, timeout, và nhiều hơn nữa — tất cả đều không có external dependency. Một middleware stack đủ dùng cho production đã đi kèm với package.

Express chỉ đi kèm 3 middleware tích hợp: express.static(), express.json(), express.urlencoded(). Mọi thứ khác đều phải npm install thêm.

Nghe có vẻ Hono thắng, nhưng hãy nhìn vào chiều sâu hệ sinh thái. Hệ sinh thái third-party chính thức của Hono hiện có 62 package dưới namespace @hono (tính đến tháng 6 năm 2026) — bao gồm auth adapter (Clerk, Auth.js, Firebase, Stytch), schema validator (Zod, Valibot, ArkType, TypeBox), OpenAPI tooling (Scalar, Swagger UI), monitoring (Sentry, OpenTelemetry, Prometheus), và các tiện ích (session, rate limiter, MCP, tRPC). Với phần lớn các API project, mức độ phủ này là đủ.

Hệ sinh thái third-party của Express là cả thế giới middleware Node.js: hàng nghìn package bao phủ mọi authentication strategy mà Passport hỗ trợ, mọi ORM integration, mọi logging stack từng được port sang Node.js. Nếu bạn có một yêu cầu middleware niche cụ thể, Express gần như chắc chắn đã có một package đã được kiểm chứng trong production. Hono có thể cần bạn tự viết adapter hoặc chờ cộng đồng port.

Sự không tương thích cơ bản là điều đáng chú ý: Express middleware dùng signature (req, res, next). Hono middleware dùng (c, next), trong đó c là context object bao bọc cả request lẫn response. Bạn không thể đưa trực tiếp một Express middleware vào Hono. Mỗi package trong package.json của bạn có API (req, res, next) là một mục trong danh sách migrate.

Nếu authentication là yếu tố quan trọng trong quyết định — chọn giữa hosted auth (Clerk) và self-hosted auth (Better Auth) — xem so sánh Better Auth vs Clerk.

TypeScript DX

Hono có 99,5% TypeScript và đi kèm types của riêng nó. Sự khác biệt thực tế thể hiện ở ba điểm.

Typed request access. c.req.param('id'), c.req.query('filter'), c.req.header('authorization') — tất cả đều có type. Không cần casting.

Typed body validation. Kết hợp Hono với schema validator và compiler biết được hình dạng của request body trước khi handler chạy:

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

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

Hono RPC. Export route type từ server và import vào client. Type inference end-to-end hoàn toàn mà không cần code generation:

// server.ts
export type AppType = typeof route

// client.ts
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]' } })
// res is typed — the compiler knows the response shape

Express với TypeScript trông ổn cho đến khi bạn gặp req.body, được type là any. Bạn có thể thêm assertion và augmentation interface, nhưng compiler sẽ không bắt được sự không khớp giữa những gì client gửi và những gì handler mong đợi. Package @types/express đạt ~57,4 triệu lượt tải hàng tuần (tính đến tuần 2026-05-27) — gần tương đương với lượt tải của chính package express — điều này cho thấy TypeScript được thêm vào sau, không được thiết kế từ đầu. Với những team từng debug lỗi req.body: any trên production, đây là vấn đề cấu trúc, không phải lời phàn nàn về ergonomics nhỏ nhặt.

Tương thích với edge và serverless

Hono chạy native trên Cloudflare Workers, Fastly Compute, Deno Deploy, Bun, Vercel Edge, Netlify Edge, AWS Lambda, Lambda@Edge, và Node.js qua @hono/node-server. Cloudflare đã đưa Hono vào hướng dẫn framework chính thức của Workers. Đây là mức độ chứng nhận từ platform gần nhất mà một framework có thể đạt được.

Express chạy native trên Node.js, trên Bun và Deno qua compatibility layer, và trên AWS Lambda qua wrapper. Nó không thể chạy trên Cloudflare Workers theo bất kỳ nghĩa thực tế nào — bundle đã vượt giới hạn kích thước trước khi bạn thêm code ứng dụng. Nếu deployment target của bạn là Cloudflare Workers hay bất kỳ V8 isolate runtime nào, Hono không chỉ là lựa chọn tốt hơn. Đó là lựa chọn duy nhất hợp lý.

Migrate từ Express sang Hono

Cú pháp routing đủ tương đồng để các app nhỏ có thể chuyển trong một ngày. Phần tốn thời gian là middleware pipeline.

Routing

// Express
app.get('/users/:id', (req, res) => {
  res.json({ id: req.params.id });
});

// Hono
app.get('/users/:id', (c) => {
  return c.json({ id: c.req.param('id') });
});

Middleware

// Express
app.use((req, res, next) => {
  if (!req.headers.authorization) return res.status(401).json({ error: 'Unauthorized' });
  next();
});

// Hono
app.use(async (c, next) => {
  if (!c.req.header('authorization')) return c.json({ error: 'Unauthorized' }, 401);
  await next();
});

Xử lý lỗi

// Express
app.use((err, req, res, next) => { res.status(500).json({ error: err.message }); });

// Hono
app.onError((err, c) => { return c.json({ error: err.message }, 500); });

Độ phức tạp khi migrate theo quy mô dự án:

  • REST API CRUD đơn giản — 1–3 ngày
  • Middleware pipeline nặng (custom auth, logging, rate limiting, session) — 1–2 tuần
  • Phụ thuộc package đặc thù của Express (Passport strategies, các thư viện với API surface (req, res, next)) — tối thiểu 2–4 tuần; lâu hơn nếu bạn dựa vào các strategy chưa có bản tương đương trong Hono

Kiểm tra dependency là bước đầu tiên. Chạy npm ls --depth=0, sau đó đánh dấu mọi package có interface middleware tương thích với Express. Danh sách đó chính là migration backlog của bạn. Trên Railway hay bất kỳ PaaS nào đang host một app Express lớn, việc migrate là một khoản đầu tư kỹ thuật với lợi ích cụ thể chỉ khi bạn thực sự cần những gì Hono cung cấp. Hãy biết lý do của mình trước khi bắt đầu.

Khi nào nên chọn Hono

  • Dự án mới triển khai lên Cloudflare Workers, Vercel Edge, hay bất kỳ V8 isolate runtime nào
  • Dự án TypeScript cần compile-time guarantee cho hình dạng request và response
  • Kích thước bundle là ràng buộc — giới hạn kích thước của Workers, cold-start latency trên serverless, Lambda cold start
  • Bạn muốn một middleware stack sẵn dùng mà không cần cài thêm package ngoài
  • Dự án Node.js mới không có legacy dependency

Khi nào nên chọn Express

  • Codebase Express hiện có — chi phí migrate hiếm khi đủ lý do để chuyển đổi trừ khi bạn có nhu cầu cụ thể về triển khai edge hoặc vấn đề TypeScript kéo dài
  • Dự án phụ thuộc vào các package gắn với API (req, res, next) mà chưa có bản tương đương trong Hono
  • Team có kinh nghiệm sâu về Express và nhiều internal tooling được xây dựng xung quanh Express conventions
  • Triển khai trên Node.js PaaS thuần túy mà edge runtime không mang lại lợi ích gì

Kết luận

Dùng Hono cho các dự án mới. Trải nghiệm TypeScript tốt hơn theo cách thiết kế, không phải theo quy ước. Bundle đủ nhỏ để chạy ở bất cứ đâu. Middleware API gọn gàng. RPC layer loại bỏ hoàn toàn một lớp lỗi type giữa client và server. Express có 15 năm khởi đầu trước và điều đó thể hiện rõ qua chiều sâu hệ sinh thái — nhưng chiều sâu chỉ quan trọng khi bạn cần thứ gì đó mà 62 package chính thức của Hono (tính đến tháng 6 năm 2026) chưa có.

Chỉ migrate app Express hiện có khi bạn có vấn đề cụ thể mà Hono giải quyết được: deployment target edge mà bạn không thể đạt tới, TypeScript khó chịu tốn thời gian debug thường xuyên, hoặc dependency bạn đang cố loại bỏ. “Hono mới hơn” không phải lý do để migrate. Một app Express đang chạy tốt là có giá trị; viết lại chỉ vì muốn viết lại thì không.

Với developer vẫn còn phân vân: hãy viết một route handler theo API của Hono. Viết một middleware. Mọi thứ có thể đọc hiểu trong 20 phút. Nếu không cảm thấy ổn, Express 5 là một bản phát hành chất lượng và sẽ được hỗ trợ tốt đến tận sau năm 2026.

Nếu bạn đã chọn Hono và đang xây dựng phần còn lại của stack: TypeScript ORM tốt nhất 2026 bao phủ tầng dữ liệu và nền tảng deploy full-stack tốt nhất năm 2026 giúp bạn chọn nơi chạy ứng dụng.

Lưu ý

Lợi thế throughput 4–5× trên Node.js đến từ community benchmark mà không công bố phần cứng hay phương pháp đo. Xu hướng nhất quán trên các nguồn; hệ số chính xác không thể xác minh độc lập từ nguồn gốc. Bảng xếp hạng TechEmpower Round 23 cho JavaScript framework không được trích xuất cho bài này — xem techempower.com/benchmarks để có số liệu mới nhất. Cold-start latency tính bằng millisecond chỉ được trích dẫn từ nguồn thứ cấp; không tìm thấy benchmark từ nguồn gốc có phương pháp rõ ràng. Bài này có chứa affiliate link.

Tham khảo