Ra mắt & Cập nhật
9 phút đọc2 tháng 6, 20262

Hono Framework web nhỏ gọn mà mạnh mẽ đến bất ngờ

Mình đào sâu vào Hono, web framework chạy được trên mọi runtime từ Cloudflare Workers đến Node.js. Nhỏ gọn, nhanh, và DX cực kỳ sướng.

N

Nguyễn Nhật Long

@nguyennhatlong1303

Hono Framework web nhỏ gọn mà mạnh mẽ đến bất ngờ

Cách đây vài tháng, mình nhận một task khá đơn giản: dựng một API gateway nhỏ chạy trên Cloudflare Workers để handle webhook từ bên thứ ba. Yêu cầu không có gì phức tạp nhận request, validate signature, transform data rồi forward sang internal service. Thường thì mình sẽ với tay lấy Express, nhưng Express không chạy được trên Workers. Itty-router thì quá minimalist, thiếu middleware ecosystem. Thế là mình thử Hono.

Và thành thật mà nói, từ lúc đó đến giờ mình đã dùng Hono cho thêm 3 project nữa. Không phải vì nó trendy, mà vì nó giải quyết đúng một bài toán mà dân dev chúng ta gặp ngày càng nhiều: viết một codebase, chạy ở bất kỳ đâu.

Hono thực sự là cái gì?

Hono (発音: /honoʊ/, nghĩa là "ngọn lửa" trong tiếng Nhật) là một web framework xây dựng hoàn toàn trên Web Standards API tức là Request, Response, fetch, URL, những thứ mà browser và hầu hết các JavaScript runtime hiện đại đều support sẵn. Điểm khác biệt cốt lõi so với Express hay Fastify là nó không phụ thuộc vào Node.js API. Không có req.params kiểu Node, không có http.createServer(). Mọi thứ đều dựa trên Web Standard.

Điều này nghe có vẻ như một chi tiết kỹ thuật nhỏ, nhưng hệ quả của nó rất lớn. Khi framework không bind vào một runtime cụ thể, bạn có thể deploy cùng một đoạn code lên Cloudflare Workers, Deno Deploy, Bun, AWS Lambda, Fastly Compute, Vercel Edge Functions, hay thậm chí Node.js truyền thống. Mình đã thực sự test chuyện này lấy một Hono app viết cho Workers, chuyển sang chạy trên Bun chỉ bằng cách đổi adapter, không sửa một dòng business logic nào.

Router engine và chuyện performance

Mình biết nhiều anh em sẽ hỏi: "Nhanh thật không hay chỉ là marketing?" Câu trả lời ngắn: nhanh thật.

Hono ship kèm nhiều router engine, và cái đáng chú ý nhất là RegExpRouter. Thay vì duyệt từng route một như Express (linear scan), RegExpRouter compile tất cả các route patterns thành một regular expression duy nhất. Khi request đến, nó chỉ cần match một lần duy nhất để tìm ra handler. Về mặt Big-O, đây là O(1) thay vì O(n) và trong thực tế, benchmark cho thấy nó nhanh hơn Express router cỡ 10-20 lần khi bạn có hàng trăm routes.

Ngoài RegExpRouter, Hono còn có TrieRouter (dùng trie data structure, dễ debug hơn), SmartRouter (tự động chọn router phù hợp), và LinearRouter (đơn giản nhất, phù hợp cho app nhỏ). Mặc định khi bạn import { Hono } from 'hono', nó dùng SmartRouter kết hợp cả RegExpRouterTrieRouter.

Về bundle size, preset hono/tiny chỉ nặng dưới 14kB. Đây là con số cực kỳ quan trọng nếu bạn deploy lên edge runtime như Cloudflare Workers, nơi mà cold start time phụ thuộc trực tiếp vào bundle size. So sánh nhanh:

Mình thấy cái hay ở chỗ Hono nằm đúng sweet spot: đủ nhỏ để chạy trên edge, đủ feature-rich để không phải tự build mọi thứ từ đầu.

FrameworkBundle size (minified)Runtime supportRouter complexity
Hono (tiny)~14kBMulti-runtimeO(1) RegExpRouter
Express~200kB+ (cần polyfill cho edge)Node.js onlyO(n) linear scan
Itty-router~1kBMulti-runtimeO(n) linear scan
Fastify~300kB+Node.js onlyRadix tree
Elysia~30kBBun onlyRadix tree

Middleware ecosystem "Batteries Included" không phải nói chơi

Một trong những lý do mình bỏ itty-router để chuyển sang Hono là middleware. Itty-router nhẹ thật, nhưng bạn phải tự viết hầu hết mọi thứ. Hono thì khác nó ship sẵn một bộ middleware khá đầy đủ:

  • CORS config CORS headers, hỗ trợ preflight requests
  • JWT verify và decode JWT token
  • Bearer Auth authentication đơn giản
  • Logger log request/response
  • Pretty JSON format JSON response đẹp hơn khi debug
  • Secure Headers thêm các security headers (X-Content-Type-Options, X-Frame-Options, etc.)
  • ETag caching với ETag
  • Compress gzip/brotli compression
  • Validator validate request body/params với Zod hoặc Valibot

Và đây mới là phần mình thích nhất: cách viết middleware trong Hono cực kỳ clean. Nó không dùng pattern (req, res, next) như Express. Thay vào đó, nó dùng (c, next) trong đó c là Context object chứa cả request lẫn response utilities:

TypeScript
1import { Hono } from 'hono'
2import { cors } from 'hono/cors'
3import { jwt } from 'hono/jwt'
4
5const app = new Hono()
6
7app.use('/api/*', cors())
8app.use('/api/protected/*', jwt({ secret: 'my-secret' }))
9
10app.get('/api/protected/profile', (c) => {
11 const payload = c.get('jwtPayload')
12 return c.json({ user: payload.sub })
13})

Thấy không? Không có res.json(), không có res.status().send(). Chỉ cần return c.json(). Handler trả về Response object đúng chuẩn Web Standard. Cái này nhìn có vẻ nhỏ nhưng nó loại bỏ hoàn toàn một class bug kinh điển trong Express: quên gọi return sau res.send() khiến code tiếp tục chạy.

TypeScript experience đây mới là thứ khiến mình "wow"

Theo kinh nghiệm của mình, TypeScript support trong hầu hết các framework thường rơi vào hai loại: hoặc là type definitions được thêm vào sau như một afterthought (Express), hoặc là over-engineered đến mức bạn phải đánh vật với generics (một số framework khác mình không tiện nêu tên).

Hono nằm ở giữa TypeScript là first-class citizen, nhưng API vẫn giữ được sự đơn giản. Cái killer feature ở đây là RPC mode. Bạn define route trên server, và Hono tự generate type cho client side mà không cần codegen step nào:

TypeScript
1// server.ts
2const route = app.get('/api/users/:id', async (c) => {
3 const id = c.req.param('id')
4 const user = await getUser(id)
5 return c.json({ user })
6})
7
8export type AppType = typeof route
TypeScript
1// client.ts
2import { hc } from 'hono/client'
3import type { AppType } from './server'
4
5const client = hc<AppType>('http://localhost:8787')
6const res = await client.api.users[':id'].$get({ param: { id: '123' } })
7const data = await res.json() // data.user is fully typed!

Không cần OpenAPI spec, không cần codegen, không cần shared schema package. Type safety end-to-end chỉ bằng typeof. Anh em nào đã dùng tRPC sẽ thấy concept này quen nhưng Hono làm điều này mà vẫn giữ được REST semantics, không bắt bạn phải adopt một protocol hoàn toàn mới.

Mình đã dùng feature này trong một project có frontend React + backend Hono trên Cloudflare Workers. Khi mình đổi response shape ở server, TypeScript compiler báo lỗi ngay ở client code. Không còn chuyện deploy xong mới phát hiện API contract bị break.

Chạy thử trên nhiều runtime trải nghiệm thực tế

Mình đã test Hono trên 3 runtime chính: Cloudflare Workers, Bun, và Node.js. Chia sẻ nhanh trải nghiệm:

Cloudflare Workers đây là nơi Hono tỏa sáng nhất. Tác giả Yusuke Wada ban đầu viết Hono chính là để dùng trên Workers. Cold start gần như instant (dưới 5ms), bundle size nhỏ, và integration với Cloudflare ecosystem (KV, D1, R2, Queues) rất mượt. Nếu bạn đang build edge API, đây là combo lý tưởng.

Bun chạy ngon, performance rất tốt nhờ Bun runtime nhanh sẵn. Tuy nhiên, mình gặp một vài edge case với streaming response khi dùng Bun version cũ. Upgrade lên Bun latest thì hết.

Node.js hoạt động ổn thông qua @hono/node-server adapter. Nhưng thành thật mà nói, nếu bạn chỉ target Node.js thôi và không có kế hoạch chạy multi-runtime, thì Fastify vẫn là lựa chọn mature hơn với ecosystem plugin phong phú hơn. Hono trên Node.js không phải là bad choice, nhưng nó không phải là best choice cho use case thuần Node.

Những điểm mình chưa thích

Không có framework nào hoàn hảo, và Hono cũng vậy. Vài điểm mình muốn anh em cân nhắc:

Ecosystem nhỏ hơn Express điều này hiển nhiên. Express có hàng nghìn middleware packages trên npm. Hono đang grow nhanh nhưng chưa thể so được. Nếu bạn cần một middleware rất niche (ví dụ OAuth2 flow phức tạp với specific provider), có thể bạn phải tự viết.

Documentation có chỗ còn mỏng docs chính thức cover đủ các use case phổ biến, nhưng khi bạn đi sâu vào advanced patterns (custom error handling phức tạp, nested router composition, testing strategies), thì phải đọc source code hoặc tìm trong GitHub discussions.

Community size so với Express hay Next.js, community Hono nhỏ hơn nhiều. Khi bạn gặp bug lạ, khả năng tìm được câu trả lời trên StackOverflow thấp hơn. Bù lại, GitHub issues được maintain khá tốt và tác giả respond nhanh.

Không phải full-stack framework Hono là backend/API framework. Nó không có built-in SSR, không có file-based routing kiểu Next.js. Có hono/jsx để render JSX trên server, nhưng nó không thay thế được React/Next cho full-stack app. Biết rõ boundary này để không expect sai.

Ai nên dùng, ai nên skip?

Sau vài tháng dùng Hono trong production, mình đúc kết thế này:

Nên dùng nếu bạn:

  • Build API/microservice chạy trên edge runtime (Cloudflare Workers, Deno Deploy, Vercel Edge)
  • Cần multi-runtime support viết một lần, deploy nhiều nơi
  • Thích TypeScript và muốn type safety end-to-end
  • Build lightweight API gateway, webhook handler, hoặc BFF (Backend for Frontend)
  • Đang dùng itty-router nhưng thấy thiếu middleware

Có thể skip nếu bạn:

  • Chỉ target Node.js và cần mature ecosystem → xem Fastify
  • Cần full-stack framework với SSR → xem Next.js, Nuxt, hoặc SvelteKit
  • Team toàn junior và cần tài liệu/tutorial phong phú → Express vẫn safe hơn
  • Đang maintain legacy Express app và không có lý do migrate

Một vài tips khi bắt đầu

Anh em lưu ý mấy điểm này khi bắt đầu với Hono:

Dùng create-hono CLI để scaffold project: npm create hono@latest. Nó sẽ hỏi bạn muốn target runtime nào và setup sẵn config phù hợp.

Nếu dùng với Cloudflare Workers, hãy dùng wrangler kết hợp Hono integrate rất tốt với Wrangler dev server, hot reload nhanh.

Khi viết middleware, nhớ rằng Hono middleware dùng async/await pattern chứ không phải callback. Gọi await next() để pass control sang middleware tiếp theo, và code sau await next() sẽ chạy trên đường response đi ra (giống Koa).

Và cuối cùng, hãy thử RPC client feature sớm. Đây là thứ mà khi bạn dùng rồi sẽ không muốn quay lại viết fetch thủ công nữa.

Hono không phải là framework sẽ thay thế Express hay Next.js. Nhưng nó chiếm một vị trí rất riêng trong hệ sinh thái JavaScript lightweight, multi-runtime, type-safe, và developer experience thuộc hàng top. Nếu bạn đang build thứ gì đó trên edge hoặc đơn giản là muốn thử một framework hiện đại mà không phải commit quá nhiều, Hono là một lựa chọn rất đáng để bỏ vài tiếng cuối tuần ra nghịch.

NN

Nguyễn Nhật Long

@nguyennhatlong1303

Nguyễn Nhật Long is a Senior Frontend Engineer and Frontend Team Leader with 7 years of experience building real-time fintech platforms. Specializing in React, Next.js, TypeScript, and React Native, shipping 10+ products across Web, Mobile, Telegram Mini-Apps, and Web3.

Thấy hay? Chia sẻ cho bạn bè!