Chapter 01

Hono 简介与核心优势

炎之名背后的框架哲学——为边缘计算而生,比 Express 快 4 倍,比 npm 包小 100 倍

什么是 Hono

Hono(発音:ホノ)在日语中意为"炎"(flame)。这个名字并非偶然——它准确描述了这个框架的核心特质:极速、轻量、炽热。

2022 年,Yusuke Wada 在 Cloudflare 工作期间需要为 Workers 平台构建一个 HTTP 框架。当时的选择要么太重(Express、Fastify),要么不支持 Edge Runtime(大量使用 Node.js 原生模块),要么类型支持不完善。于是他决定从零开始,创造一个专为 Web Standards API 设计的框架——不依赖任何 Node.js 特有 API,只使用 `Request`/`Response`/`Headers` 等 W3C 标准对象。

🔥

Hono 的设计哲学:使用 Web Standards API(Fetch API 规范),而非 Node.js 的 http.IncomingMessage。这一决定使得 Hono 能够在任何实现了 Web Standards 的运行时上运行,无需任何修改。

名词解释:理解边缘计算

性能基准:与主流框架对比

以下数据来自 TechEmpower Framework Benchmarks(Round 22)和 Bun 官方基准测试,测试场景为纯 JSON 响应(plaintext/JSON):

框架运行时req/s延迟 p99包大小
HonoBun~210,000 最快~0.6ms14KB
ElysiaBun~195,000~0.7ms~50KB
HonoNode.js~110,000~1.2ms14KB
FastifyNode.js~95,000~1.5ms~200KB
ExpressNode.js~47,000~3.8ms~500KB

基准测试仅供参考:Hello World 级别的 req/s 在真实业务中意义有限。数据库查询、外部 API 调用、复杂业务逻辑才是实际瓶颈。选择 Hono 的核心理由应是其优秀的 API 设计、TypeScript 支持和多运行时兼容性,而非单纯性能数字。

运行时支持矩阵

Hono 的"一套代码,多端运行"并非空话。框架内置了适配器(adapter),针对每个运行时提供最优化的集成:

运行时适配器特点推荐场景
Cloudflare Workers内置全球 300+ 节点,KV/R2/D1 绑定API Gateway、边缘逻辑
Cloudflare Pages内置与 Workers 共享运行时全栈网站
Bun内置极速启动,内置 SQLite本地开发、小型服务
Deno内置原生 TypeScript,内置权限系统脚本、微服务
Node.js内置最广生态兼容性传统服务器、企业项目
AWS Lambda内置Serverless 函数事件驱动架构
Vercel Edge内置与 Next.js 集成全栈 Next.js 项目
Netlify Edge内置基于 Deno 运行时静态网站增强

核心特性速览

内置路由器

Hono 内置了多种路由器,可根据使用场景切换:

完整的 TypeScript 类型推断

Hono 的泛型系统允许将路径参数、查询参数、请求体类型全部传递给 Context,从而实现完整的端到端类型安全——包括 RPC 模式下的客户端调用。

内置中间件生态

无需安装第三方包,Hono 内置了 logger、cors、compress、etag、cache、basicAuth、bearerAuth、jwt、csrf 等常用中间件,通过 hono/middleware 子路径导入。

安装与第一个 Hono 应用

方式一:Bun(推荐用于本地开发)

# 使用官方脚手架创建项目
bun create hono my-app
# 选择 bun 模板

cd my-app
bun install
bun run dev

脚手架生成的项目结构:

my-app/
├── src/
│   └── index.ts       # 入口文件
├── package.json
├── tsconfig.json
└── biome.json         # 代码格式化(可选)

方式二:Node.js(传统服务器)

# 创建项目
mkdir hono-app && cd hono-app
npm init -y
npm install hono
npm install -D @hono/node-server typescript tsx

# tsconfig.json 最简配置
// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true
  }
}

Hello World — Bun 版

// src/index.ts — Bun 运行时
import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => {
  return c.text('Hello Hono! 🔥')
})

app.get('/json', (c) => {
  return c.json({ message: 'Hello from Hono', runtime: 'Bun' })
})

export default app  // Bun / Cloudflare Workers 使用 export default
# 启动(Bun 自动检测 export default 的 Hono 实例)
bun run src/index.ts
# 输出:Started server http://localhost:3000

Hello World — Node.js 版

// src/index.ts — Node.js 运行时
import { Hono } from 'hono'
import { serve } from '@hono/node-server'

const app = new Hono()

app.get('/', (c) => c.text('Hello Hono! 🔥'))

serve({
  fetch: app.fetch,  // 将 Hono 的 fetch handler 传给 Node.js 适配器
  port: 3000,
}, (info) => {
  console.log(`Server running at http://localhost:${info.port}`)
})
# 启动
npx tsx src/index.ts
# 或通过 package.json scripts
npm run dev

关键设计:app.fetch——Hono 暴露的核心接口就是一个标准的 (Request) => Response | Promise<Response> 函数。这与 Web Fetch API 完全兼容,各运行时的适配器只需将平台特有的请求对象转换为标准 Request,再将标准 Response 转回平台格式。这是 Hono 多运行时兼容的核心机制。

项目结构推荐

src/
├── index.ts           # 入口:创建 app 实例,挂载路由
├── routes/
│   ├── users.ts       # 用户相关路由
│   ├── posts.ts       # 文章相关路由
│   └── auth.ts        # 认证路由
├── middleware/
│   ├── auth.ts        # 自定义认证中间件
│   └── logger.ts      # 请求日志中间件
├── lib/
│   ├── db.ts          # 数据库连接
│   └── jwt.ts         # JWT 工具函数
└── types.ts           # 全局类型定义(Env、Variables 等)

本章小结:Hono 是一个以 Web Standards API 为核心的超轻量 HTTP 框架。它通过使用标准 Request/Response 对象实现跨运行时兼容,通过 RegExpRouter 实现极速路由匹配,通过 TypeScript 泛型实现端到端类型安全。下一章我们将深入学习 Hono 的路由系统,掌握从基础路由到嵌套路由器的全部用法。