Hono vs Express: The Right Node.js API Framework in 2026
Pick Hono for edge deployments and TypeScript-first DX. Stay on Express if you rely on Passport.js or a middleware stack you cannot replace.
By Ethan
1,269 words · 7 min read
Pick Hono if you’re deploying to edge runtimes, starting a greenfield TypeScript project, or need sub-millisecond cold starts on Cloudflare Workers. Pick Express if you have an existing codebase with Passport.js or a library that depends on the (req, res, next) signature — migration cost will eat any performance gain you’d see.
Who this is for
Backend engineers choosing a framework for a new Node.js API, or teams evaluating whether Hono is worth migrating to. If you’re running Express v4 without issues, there’s no compelling reason to migrate. If you’re starting fresh — especially targeting an edge runtime — read on.
What we tested
Hono v4.12.21 (released May 19, 2026) against Express v5.2.1 (v5.0.0 shipped October 2024; v5.1.0 became npm latest in March 2025). Express v5 requires Node.js ≥ 18. Hono runs on Node.js ≥ 16, Bun, Deno, Cloudflare Workers, Vercel Edge, Netlify Edge, and AWS Lambda.
Performance numbers come from Hono’s own published benchmarks (hono.dev/docs/concepts/benchmarks), run on Apple M1 Pro (32 GB RAM) for the Cloudflare Workers suite and Bombardier (100 concurrent, 10-second duration) for the Deno suite.
Setup and first route
Both frameworks get you a running server in under ten lines.
Hono:
import { Hono } from 'hono'
const app = new Hono()
app.get('/posts/:id', (c) => {
const id = c.req.param('id')
const page = c.req.query('page')
return c.json({ id, page })
})
export default app // works on Workers, Deno, Bun, Node.js
Express v5:
import express from 'express'
const app = express()
app.get('/posts/:id', (req, res) => {
const { id } = req.params
const { page } = req.query
res.json({ id, page })
})
app.listen(3000) // Node.js only
The key difference isn’t syntax — it’s the exit point. Hono’s export default app is a standard Web API fetch handler. It deploys to any runtime that speaks the Fetch API. Express’s app.listen(3000) ties you to Node.js.
Hono is TypeScript-first with inferred types out of the box. Express requires @types/express, and types are less precise — route parameter inference doesn’t propagate through the handler the same way.
Performance
Hono’s performance advantage is real at high concurrency. At typical CRUD API load (~100 req/s), it is not measurable.
Cloudflare Workers — ops/sec:
| Router | ops/sec | ±% |
|---|---|---|
| Hono | 402,820 | ±4.78% |
| Sunder | 297,036 | ±4.76% |
| itty-router | 212,598 | ±3.11% |
| Worktop | 197,345 | ±2.40% |
Hono is ~35% faster than the second-place Workers framework. Express doesn’t appear in this table because it doesn’t run on Cloudflare Workers at all.
Deno — req/s (Bombardier, 100 concurrent):
| Framework | req/s |
|---|---|
| Hono | 136,112 |
| Fast | 103,214 |
| Oak | 43,326 |
| Opine | 30,700 |
Hono delivers 3.1× the throughput of Oak, the previous Deno default. Again, Express is absent — it doesn’t run on Deno.
On Node.js at high concurrency, Hono handles the load better than Express — though the specific numbers from hono.dev are screenshots only and not directly citable. At 100 req/s — a realistic CRUD API — there’s no measurable latency difference. Don’t pick Hono for Node.js performance. Pick it for runtime portability. If Deno’s sandboxed security model is part of the appeal, see Deno vs Node.js for how they compare.
Note: TechEmpower Framework Benchmarks were archived in March 2026. Don’t cite them as a current source.
Bundle size
| Hono | Express v5 | |
|---|---|---|
| Bundle (gzipped) | 7.2 KB | 236 KB |
| Install footprint | ~14 KB, 0 dependencies | ~2 MB of dependencies |
| Cold start (CF Workers) | Sub-millisecond | Not supported |
The bundle size delta matters on edge. A 236 KB import hits cold start limits on Cloudflare Workers’ free tier. Hono’s 7.2 KB footprint doesn’t.
Middleware ecosystem
Hono ships 25 built-in middlewares. Express has none built in — every feature is a separate npm install.
| Feature | Hono | Express |
|---|---|---|
| CORS | ✅ hono/cors | ❌ cors package |
| JWT auth | ✅ hono/jwt | ❌ express-jwt / passport-jwt |
| CSRF | ✅ hono/csrf | ❌ csurf (deprecated) |
| Secure headers | ✅ hono/secure-headers | ❌ helmet |
| Body limit | ✅ hono/body-limit | ❌ manual |
| Logger | ✅ hono/logger | ❌ morgan |
| Compression | ✅ hono/compress | ❌ compression |
For third-party: Hono has Auth.js, Clerk, Firebase Auth, Zod OpenAPI, Sentry, and tRPC adapters. The list is growing fast but shallower than Express’s decade-deep npm ecosystem.
The one hard stop: Hono cannot use Express middleware. Express uses (req, res, next) signatures. Hono uses a Web Standards Context object. They’re incompatible. If your stack depends on Passport.js — there’s no direct port. You’d replace it with Hono’s Auth.js adapter. If that migration is worth doing depends on what else you’re changing.
Edge runtime support
| Runtime | Hono | Express |
|---|---|---|
| Node.js ≥ 18 | ✅ | ✅ |
| Bun | ✅ | ⚠️ via compat layer |
| Deno | ✅ | ❌ |
| Cloudflare Workers | ✅ (officially supported) | ❌ |
| Vercel Edge Functions | ✅ | ❌ |
| Netlify Edge Functions | ✅ | ❌ |
| AWS Lambda | ✅ | ⚠️ via serverless-http |
Cloudflare’s official framework guides list Hono as a supported choice for Workers deployments (developers.cloudflare.com/workers/framework-guides). If you’re shipping to Cloudflare Workers, Hono is the obvious choice. See Cloudflare Workers vs AWS Lambda to decide which serverless platform fits your deployment model.
Verdict
Pick Hono if:
- You’re deploying to Cloudflare Workers, Deno, Bun, or any Fetch-API runtime
- You’re starting fresh and want TypeScript-first DX with zero-dependency footprint
- Cold start time matters (serverless, edge functions)
- You want security middleware (CORS, JWT, CSRF) without assembling six separate packages
Stay on Express if:
- You have an existing codebase with Passport.js or other
(req, res, next)middleware - Your team is unfamiliar with the Web Standards
ContextAPI - Ecosystem maturity and battle-tested libraries outweigh DX improvements
- You’re deploying Node.js-only and have no plans to change
Express v5 is a legitimate upgrade from v4. Async error propagation alone is worth it for existing Express projects. But it closes no gap with Hono on runtime portability or bundle size. If you’re evaluating Bun alongside Hono for your next API project, Bun vs Node.js covers whether Bun’s runtime is production-ready for your use case.
Caveats
Benchmarks from Hono’s own test suite should be read with the usual vendor caveats — they chose the workload and machine. The Deno numbers use Hono v3.0.0, not v4; more recent independent Node.js/Bun benchmarks from Hono’s published suite are screenshots only and not directly citable. The performance story at high concurrency is consistent across independent sources, but exact numbers should prompt you to run your own benchmark on your actual workload.
npm download counts: Express ~93–95M weekly, Hono ~34.5M weekly. Hono’s growth is ~40× year-over-year (from ~934K to ~37.7M weekly downloads, May 2025 → May 2026) but its count is inflated by CI pipelines and bundler transitive deps. Treat both as adoption-momentum proxies, not absolute usage signals.
This article contains an affiliate link to Cloudflare Workers. That doesn’t change the verdict — Hono is the right choice for Workers deployments regardless.
References
- Hono v4.12.21: github.com/honojs/hono
- Hono benchmarks: hono.dev/docs/concepts/benchmarks
- Hono third-party middleware: hono.dev/docs/middleware/third-party
- Express v5 release: expressjs.com/2024/10/15/v5-release.html
- npm trends: npmtrends.com/express-vs-hono
- Cloudflare Workers + Hono: developers.cloudflare.com/workers/framework-guides
- Hono middleware compat issue: github.com/honojs/hono/issues/3293
- TechEmpower archived: dev.to/kaliumhexacyanoferrat/techempower-framework-benchmarks-are-now-archived-whats-next-3l0a