📖 目录
- 🔥 火焰的起源:Hono的故事
- 👨 创始人Yusuke Wada:一个典型的"刨洋葱"案例
- 🚀 快速开始:30秒上手
- ✨ 核心特性:为什么选择Hono
- 🎯 Hono vs Go Gin:跨语言的相似之美
- 💡 最佳实践:干货满满
- 🔮 谁在使用Hono
🔥 火焰的起源:Hono的故事
Hono(炎)在日语中意为"火焰",这个名字与"flare"(Cloudflare)有着微妙的联系[[7]][[17]]。
2021年12月,Cloudflare的工程师Yusuke Wada(@yusukebe)开始了这个项目的开发[[6]][[19]]。当时他面临一个困境:想为Cloudflare Workers创建应用,但发现:
- 不用框架:代码变得冗长难维护
- 现有框架:找不到完全符合需求的
itty-router太简单Worktop和Sunder的API不够优雅
于是,一个典型的"刨洋葱"(yak shaving)故事开始了:本想做个应用,结果先做了个框架!

但这次"刨洋葱"非常有价值。如今,Hono不仅被Cloudflare用于核心产品(D1、Workers KV、Queues等),还被Unkey、OpenStatus等众多公司采用
👨💻 创始人Yusuke Wada:一个典型的"刨洋葱"案例
Yusuke Wada,日本开发者,Cloudflare Senior Developer Advocate,Hono的创造者
他的初衷很简单:
"我想创建一个基于Trie树结构的路由器,因为它很快。"
从2021年12月至今,Hono已经发展成为一个支持多运行时的框架:
- Cloudflare Workers
- Deno
- Bun
- Node.js
- AWS Lambda
- Fastly Compute
- Vercel、Netlify等
关键转折点:在v2版本时,Yusuke决定支持Deno和Bun。这个决定非常明智——如果只针对Cloudflare Workers,Hono可能不会有今天的成功
🚀 快速开始:30秒上手
安装方式(多种选择)
# npm
npm create hono@latest
# yarn
yarn create hono
# pnpm
pnpm create hono@latest
# Bun
bun create hono@latest
# Deno
deno init --npm hono@latest
Hello World(跨平台运行)
创建 src/index.ts:
import {
Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Hono! 🔥'))
app.get('/hello/:name', (c) => {
const name = c.req.param('name')
return c.json({
message: `Hello ${
name}!` })
})
export default app
运行方式(同一代码,不同平台):
# Cloudflare Workers
wrangler dev src/index.ts
# Deno
deno serve src/index.ts
# Bun
bun run src/index.ts
# Node.js
npx hono-node src/index.ts
这就是真正的 "Write once, run anywhere"
✨ 核心特性:为什么选择Hono
1. 超快速 ⚡
Hono的RegExpRouter是JavaScript世界中最快的路由器之一[[43]]:
Hono x 402,820 ops/sec ±4.78%
itty-router x 212,598 ops/sec ±3.11%
sunder x 297,036 ops/sec ±4.76%
worktop x 197,345 ops/sec ±2.40%
✨ Hono是最快的!
2. 超轻量 🪶
hono/tiny预设:仅14KB(minified)- Express对比:572KB
- 零依赖,只使用Web Standards API
3. 多运行时支持 🌍
// 同一份代码,运行在任何地方!
import {
Hono } from 'hono'
const app = new Hono()
app.get('/api/users', (c) => {
return c.json({
users: [] })
})
export default app
4. 洋葱结构中间件 🧅
Hono的中间件系统像洋葱一样,请求和响应可以层层处理:
import {
Hono } from 'hono'
import {
logger } from 'hono/logger'
import {
cors } from 'hono/cors'
import {
jwt } from 'hono/jwt'
const app = new Hono()
// 使用中间件
app.use('*', logger())
app.use('/api/*', cors())
app.use('/auth/*', jwt({
secret: 'your-secret' }))
// 自定义中间件
app.use(async (c, next) => {
console.log(`${
c.req.method} ${
c.req.path}`)
await next()
console.log('Response sent!')
})
app.get('/', (c) => c.text('Hello!'))
5. 内置中间件和Helpers 🔋
开箱即用的功能:
import {
basicAuth } from 'hono/basic-auth'
import {
bearerAuth } from 'hono/bearer-auth'
import {
etag } from 'hono/etag'
import {
cache } from 'hono/cache'
import {
compress } from 'hono/compress'
const app = new Hono()
app.use(etag(), cache({
cacheName: 'my-app' }))
app.use('/admin/*', basicAuth({
username: 'admin',
password: 'secret'
}))
app.get('/api/*', bearerAuth())
内置功能包括:
- 认证:Basic、Bearer、JWT
- 性能:缓存、压缩、ETag
- 安全:CORS、Secure Headers
- 工具:Logger、Cookie、Body Limit
- 渲染:JSX、HTML、Streaming
- 第三方:Zod验证、Clerk、Auth.js等[[43]]
6. 强大的TypeScript支持 💪
Hono的类型系统非常强大,特别是RPC模式:
import {
z } from 'zod'
import {
zValidator } from '@hono/zod-validator'
import {
hc } from 'hono/client'
// 服务端
const schema = z.object({
id: z.number(),
title: z.string()
})
const app = new Hono().post('/posts', zValidator('json', schema), (c) => {
const data = c.req.valid('json')
return c.json({
message: `${
data.id} is ${
data.title}` })
})
// 导出类型
export type AppType = typeof app
// 客户端(类型安全!)
const client = hc<AppType>('http://localhost:8787')
// 自动补全和类型检查!
const res = await client.posts.$post({
json: {
id: 1, title: 'Hello' }
})
这就是魔法:服务端的API规范自动同步到客户端,无需手动维护!
7. 服务器端JSX 🎨
Hono的JSX专为服务器端设计,无需renderToString():
import {
Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => {
return c.html(
<html>
<head><title>Hono App</title></head>
<body>
<h1>Hello World!</h1>
<p>Server-side JSX works!</p>
</body>
</html>
)
})
独特之处:JSX标签被当作字符串处理,可以直接返回[[14]]。
🎯 Hono vs Go Gin:跨语言的相似之美
为什么Hono和Gin很像?
虽然Hono是JavaScript/TypeScript框架,Gin是Go框架,但它们在设计理念上惊人地相似:
| 特性 | Hono (JS/TS) | Gin (Go) |
|---|---|---|
| 性能 | 超快速(RegExpRouter) | 最快的Go框架之一 |
| API设计 | 简洁直观 | 简洁直观 |
| 中间件 | 洋葱模型 | 中间件链 |
| 路由 | 参数化路由 | 参数化路由 |
| 学习曲线 | 1-2天 | 1-2天 |
| 适用场景 | API、边缘计算 | API、微服务 |
代码对比
Hono (TypeScript):
import {
Hono } from 'hono'
const app = new Hono()
// 路由参数
app.get('/users/:id', (c) => {
const id = c.req.param('id')
return c.json({
id })
})
// 中间件
app.use('*', logger())
// 分组路由
const api = new Hono().basePath('/api')
api.get('/posts', (c) => c.json({
posts: [] }))
export default app
Gin (Go):
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
// 路由参数
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{
"id": id})
})
// 中间件
r.Use(gin.Logger())
// 分组路由
api := r.Group("/api")
{
api.GET("/posts", func(c *gin.Context) {
c.JSON(200, gin.H{
"posts": []})
})
}
r.Run()
}
相似度高达90%!如果你熟悉Gin,上手Hono会非常快;反之亦然。
性能对比
根据基准测试,Hono (Deno) vs Go (Gin) 在URL短链接服务中的表现[[38]][[39]]:
Hono (Deno): 约 50,000+ req/sec
Go (Gin): 约 70,000+ req/sec
虽然Gin略快(毕竟是编译型语言),但Hono作为JavaScript框架,性能已经非常出色!
有趣的事实:有一个hono.go项目,基于Hono.js理念开发的Go框架,声称比Gin快1.5倍!
💡 最佳实践:干货满满
1. 项目结构建议
my-hono-app/
├── src/
│ ├── index.ts # 入口文件
│ ├── routes/ # 路由模块
│ │ ├── users.ts
│ │ └── posts.ts
│ ├── middleware/ # 自定义中间件
│ │ └── auth.ts
│ ├── validators/ # 验证器
│ │ └── schemas.ts
│ └── utils/ # 工具函数
├── wrangler.toml # Cloudflare配置
└── package.json
2. 路由模块化
// src/routes/users.ts
import {
Hono } from 'hono'
const users = new Hono().basePath('/users')
users.get('/', (c) => c.json({
users: [] }))
users.get('/:id', (c) => c.json({
id: c.req.param('id') }))
users.post('/', (c) => c.json({
created: true }, 201))
export default users
// src/index.ts
import {
Hono } from 'hono'
import users from './routes/users'
const app = new Hono()
app.route('/', users)
export default app
3. 错误处理中间件
import {
Hono } from 'hono'
import {
HTTPException } from 'hono/http-exception'
const app = new Hono()
// 全局错误处理
app.onError((err, c) => {
if (err instanceof HTTPException) {
return c.json({
error: err.message,
status: err.status
}, err.status)
}
return c.json({
error: 'Internal Server Error'
}, 500)
})
// 404处理
app.notFound((c) => {
return c.json({
message: 'Not Found' }, 404)
})
4. 使用Zod进行验证
import {
z } from 'zod'
import {
zValidator } from '@hono/zod-validator'
const createUserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
age: z.number().min(18).optional()
})
app.post('/users', zValidator('json', createUserSchema), (c) => {
const data = c.req.valid('json')
// data 已经过验证,类型安全!
return c.json({
user: data, created: true })
})
5. Cloudflare Bindings集成
type Env = {
Bindings: {
DB: D1Database
KV: KVNamespace
R2: R2Bucket
}
}
const app = new Hono<{
Env }>()
app.get('/messages', async (c) => {
const {
results } = await c.env.DB.prepare('SELECT * FROM messages').all()
return c.json(results)
})
app.post('/cache', async (c) => {
const body = await c.req.json()
await c.env.KV.put('key', JSON.stringify(body))
return c.json({
success: true })
})
类型自动补全,开发体验极佳!
6. 测试最佳实践
import {
Hono } from 'hono'
import {
describe, it, expect } from 'vitest'
const app = new Hono()
app.get('/', (c) => c.text('Hello'))
describe('API Tests', () => {
it('should return 200', async () => {
const res = await app.request('/')
expect(res.status).toBe(200)
expect(await res.text()).toBe('Hello')
})
})
无需启动服务器,直接测试!这是Web Standards的优势
7. 性能优化技巧
// 使用压缩
import {
compress } from 'hono/compress'
app.use(compress())
// 使用缓存
import {
cache } from 'hono/cache'
app.get('/api/data', cache({
cacheName: 'my-app', maxAge: 3600 }), (c) => {
return c.json({
data: 'cached' })
})
// 使用ETag
import {
etag } from 'hono/etag'
app.use(etag())
8. 流式响应(适合AI应用)
app.get('/stream', (c) => {
return c.streamText(async (stream) => {
for (let i = 0; i < 5; i++) {
await stream.write(`Chunk ${
i}\n`)
await new Promise(r => setTimeout(r, 1000))
}
})
})
🔮 谁在使用Hono
根据官方调查,以下公司和项目在生产环境中使用Hono[[1]][[43]]:
大厂和知名项目
- Cloudflare:D1、Workers KV、Queues等核心产品
- Unkey:API认证和授权平台
- OpenStatus:网站和API监控平台
- Clerk:用户管理平台
- BaseAI:AI代理框架
- Prisma、Resend、Vercel AI SDK、Supabase:在示例中使用
🎉 总结:为什么选择Hono?
✅ 适合你,如果:
- 需要超快速的API服务
- 想在边缘计算(Cloudflare Workers等)上运行
- 喜欢简洁的API设计(类似Express或Go Gin)
- 需要TypeScript类型安全
- 想要零配置、快速开发
- 关注包大小和性能
❌ 可能不适合,如果:
- 需要完整的全栈框架(如Next.js)
- 重度依赖Node.js特有API
- 需要庞大的生态系统