Hono: framework khiến tôi xóa sạch middleware Express
Tôi có một Cloudflare Worker làm đúng một việc: xác thực JWT, gọi database, trả JSON. Năm mươi dòng logic. Thư mục node_modules cho dev dependencies nặng 180MB. Cold start thì chậm tới mức xấu hổ. Tôi biết sai, kiểu như biết vòi nước bị rỉ — đêm nào cũng nghe nhưng sửa là phải đụng vào ống nước.
Rồi một người trên Twitter bảo “xài Hono đi” theo kiểu người ta bảo “xài Linux đi.” Tôi lườm rồi thử.
Cả framework cài xong trong chưa tới một giây. Worker của tôi từ mười bốn dependency còn hai. Cold start rớt xuống con số mà trước giờ tôi chỉ thấy ở file tĩnh, không phải server logic. Cảm giác như mang ba lô đá bấy lâu mà ai đó vừa kéo khóa mở ra.
Cái mẹo mà tôi suýt bỏ qua
Hono không phát minh runtime. Không bọc module http của Node qua sáu lớp trừu tượng. Nó xây trên Web Standards — cùng Request và Response mà trình duyệt đã biết. Đó là toàn bộ mẹo.
import { Hono } from "hono";
const app = new Hono();
app.get("/api/user/:id", async (c) => {
const id = c.req.param("id");
const user = await getUser(id);
return c.json(user);
});
export default app;
Nếu bạn từng viết fetch handler, bạn đã hiểu mental model của Hono. Không có trò đoán req.query hay req.params hay req.body. Không bị lẫn res.send với res.json với res.end. Context vào, response ra. Hết.
Vì sao chuyện này quan trọng hơn bạn tưởng
Đặt cược vào Web Standards là thứ giúp Hono chạy ở mọi nơi. Cùng một đoạn code deploy lên Cloudflare Workers, Deno Deploy, Bun, AWS Lambda, Vercel Edge Functions, và cả Node.js thuần. Không phải “tương thích với vài quirk.” Thật sự cùng một file.
| Framework | Bị khóa runtime | Cold start | Cách tiếp cận |
|---|---|---|---|
| Express | Chỉ Node.js | Nặng | Bọc module http của Node |
| Fastify | Chỉ Node.js | Trung bình | Tối ưu http Node |
| Hono | Chạy mọi nơi | Tối thiểu | Web Standards gốc |
Tính di động runtime không chỉ là lý thuyết. Tôi viết API trên Cloudflare Workers, sáu tháng sau chuyển sang Bun vì cần WebSocket mà Workers chưa hỗ trợ. Đổi entry point. Giữ nguyên route. Giữ nguyên middleware. Giữ nguyên thần kinh.
Chuyện middleware
Middleware của Hono là nơi tính cách lộ rõ. JWT validation, CORS, ETag, compression, Bearer auth có sẵn — đều là single-import, không phụ thuộc bên ngoài. Không cần chuỗi npm install passport passport-jwt passport-local express-session connect-mongo mà mỗi cái kéo theo bốn mươi cái khác.
import { Hono } from "hono";
import { jwt } from "hono/jwt";
import { cors } from "hono/cors";
const app = new Hono();
app.use("/api/*", cors());
app.use("/api/*", jwt({ secret: "mySecret" }));
app.get("/api/protected", (c) => {
const payload = c.get("jwtPayload");
return c.json({ user: payload.sub });
});
Mười hai dòng. Auth và CORS. Không cần object cấu hình dài ba màn hình.
Phần thành thật
Hono không phải Express. Hệ sinh thái nhỏ hơn. Nếu cần tích hợp OAuth provider cụ thể, bạn có thể phải tự viết. Cộng đồng đang lớn nhanh — gần 30 nghìn star trong ba năm — nhưng so với hơn một thập kỷ của Express thì vẫn còn trẻ.
Type inference trong chế độ RPC rất hay nhưng cũng cứng đầu. Nếu team bạn không thích kiểu validation kiểu Zod nhúng vào định nghĩa route, bạn sẽ đánh nhau với framework thay vì tận hưởng nó.
Và tài liệu, dù tốt, giả sử bạn đã biết làm web API. Nếu đang học backend lần đầu, Express vẫn có nhiều tutorial, câu trả lời Stack Overflow, và bài viết giải thích mọi edge case hơn. Docs của Hono giải thích cách làm nhưng đôi khi bỏ qua vì sao bạn muốn làm vậy.
Điều tôi cứ nghĩ hoài
Web platform đang dần trở thành universal runtime. Deno, Bun, Cloudflare Workers, ngay cả Node.js — tất cả đều đang hội tụ về Web Standards. Hono đặt cược vào sự hội tụ đó trước khi nó rõ ràng. Mỗi tháng trôi qua, thêm một runtime hỗ trợ fetch, và cách tiếp cận của Hono trông bớt phản chủ lưu, thêm phần tất yếu.
Tháng trước tôi xóa repo boilerplate Express. Một template tôi giữ bốn năm, có session handling, rate limiting, error middleware, và file README mà tôi thầm tự hào. Tôi thay tất cả bằng ba mươi dòng Hono. README giờ ghi “xem hono.dev.”
Đôi khi code hay nhất bạn từng viết là code bạn xóa đi.
honojs/hono · MIT · 29k stars · docs