周下载量 600个W,这个TS版Gin框架火了?

简介: Hono(日语“火焰”)是轻量、极速的全栈Web框架,专为边缘计算设计。支持Cloudflare Workers、Deno、Bun等多运行时,零依赖、仅14KB,内置TypeScript强类型、洋葱中间件、JSX服务端渲染及丰富官方中间件,真正“Write once, run anywhere”。

📖 目录


🔥 火焰的起源:Hono的故事

Hono(炎)在日语中意为"火焰",这个名字与"flare"(Cloudflare)有着微妙的联系[[7]][[17]]。

2021年12月,Cloudflare的工程师Yusuke Wada(@yusukebe)开始了这个项目的开发[[6]][[19]]。当时他面临一个困境:想为Cloudflare Workers创建应用,但发现:

  • 不用框架:代码变得冗长难维护
  • 现有框架:找不到完全符合需求的
    • itty-router 太简单
    • WorktopSunder 的API不够优雅

于是,一个典型的"刨洋葱"(yak shaving)故事开始了:本想做个应用,结果先做了个框架!

image.png

但这次"刨洋葱"非常有价值。如今,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
  • 需要庞大的生态系统

相关文章
|
11天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
5557 13
|
18天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
22111 118