Hono

基于 Web 标准的超快框架 - 运行于 Cloudflare Workers、Deno、Bun、Node.js 和 AWS Lambda

TL;DR

一句话:Hono 是基于 Web 标准的超快框架——从 Cloudflare Workers 到 Node.js 到处运行。

核心优势

  • 超快 - RegExpRouter 几乎零内存分配
  • 多运行时 - Cloudflare、Deno、Bun、Node、AWS Lambda
  • 极小体积 - hono/tiny 仅 12kB,零依赖
  • TypeScript 优先 - 路由完整类型推断

Core Concepts

概念 1:Context 对象

每个处理函数接收 Context,包含请求/响应工具:

app.get('/users/:id', (c) => {
  const id = c.req.param('id')        // 路径参数
  const name = c.req.query('name')    // 查询字符串
  const token = c.req.header('Authorization')

  return c.json({ id, name })  // JSON 响应
})

概念 2:中间件栈

中间件在处理函数前/后运行:

import { logger } from 'hono/logger'
import { cors } from 'hono/cors'
import { jwt } from 'hono/jwt'

app.use('*', logger())
app.use('/api/*', cors())
app.use('/api/*', jwt({ secret: process.env.JWT_SECRET }))

// 自定义中间件
app.use('*', async (c, next) => {
  const start = Date.now()
  await next()
  console.log(`${c.req.method} ${c.req.path} - ${Date.now() - start}ms`)
})

概念 3:类型安全路由

从路由到客户端的完整 TypeScript 推断:

const routes = app
  .get('/users', (c) => c.json([{ id: 1, name: 'John' }]))
  .post('/users', async (c) => {
    const body = await c.req.json()
    return c.json(body, 201)
  })

// 类型安全客户端
import { hc } from 'hono/client'
const client = hc<typeof routes>('http://localhost:3000')
const res = await client.users.$get()  // 完全类型化!

Quick Start

创建项目

npm create hono@latest my-app
cd my-app

创建 index.ts

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.json({ message: 'Hello Hono!' }))

export default app

运行

npm run dev
# 打开 http://localhost:3000

Gotchas

路由组和组合

const api = new Hono()
api.get('/users', (c) => c.json([]))
api.post('/users', (c) => c.json({}))

const admin = new Hono()
admin.use('*', authMiddleware)
admin.get('/stats', (c) => c.json({}))

app.route('/api', api)
app.route('/admin', admin)

Zod 验证

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

const schema = z.object({
  name: z.string().min(1),
  email: z.string().email(),
})

app.post('/users',
  zValidator('json', schema),
  (c) => {
    const data = c.req.valid('json')  // 有类型!
    return c.json(data, 201)
  }
)

不同响应类型

// JSON
c.json({ key: 'value' })

// 文本
c.text('Hello')

// HTML
c.html('<h1>Hello</h1>')

// 带状态码
c.json({ error: 'Not found' }, 404)

// 重定向
c.redirect('/new-location')

部署到不同运行时

// Cloudflare Workers
export default app

// Node.js
import { serve } from '@hono/node-server'
serve(app)

// Bun
export default app  // 原生支持

// Deno
Deno.serve(app.fetch)

When to Use

适合

  • Edge/Serverless API
  • Cloudflare Workers 项目
  • 多运行时应用
  • 想要 Express 式 DX 加现代性能的团队

不适合

  • 带 SSR 的全栈应用(用 Next.js/Nuxt)
  • 需要重度 ORM 集成的项目
  • 不熟悉 TypeScript 的团队

对比

特性HonoExpressFastify
体积~12kB~200kB~2MB
Edge 支持原生有限
TypeScript一流附加良好
性能超快中等

Next Steps

Cheatsheet

模式代码
GET 路由app.get('/path', handler)
POST 路由app.post('/path', handler)
路径参数c.req.param('id')
查询参数c.req.query('name')
JSON 请求体await c.req.json()
JSON 响应c.json({ data })
路由组app.route('/api', apiRoutes)
中间件app.use('*', middleware)
验证zValidator('json', schema)