什么是 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 的运行时上运行,无需任何修改。
名词解释:理解边缘计算
- Edge Runtime 边缘运行时。代码不运行在集中式数据中心,而是分布在全球各地的边缘节点(通常是 CDN PoP 点)上执行。用户请求由最近的节点处理,延迟可低至个位数毫秒。Cloudflare Workers 是目前最成熟的边缘运行时平台,全球拥有超过 300 个节点。
-
Service Worker
最初是浏览器的 API,允许在独立线程中拦截和处理网络请求。Cloudflare Workers 采用了相同的编程模型:监听
fetch事件,返回Response对象。这就是为什么 Workers 代码看起来和浏览器 Service Worker 几乎一样。 - WinterCG 标准 Web-interoperable Runtimes Community Group,W3C 下的社区工作组,负责制定非浏览器 JavaScript 运行时应实现的 Web API 规范。成员包括 Cloudflare、Vercel、Deno、Node.js 等。Hono 严格遵循 WinterCG 标准,保证跨平台兼容性。
- V8 Isolate Cloudflare Workers 的执行单元。每个 Worker 运行在独立的 V8 Isolate(隔离沙箱)中,而非独立进程。Isolate 的启动时间约为 5ms(对比 Node.js 进程的 ~100ms),这是 Workers 实现近零冷启动的关键技术。Hono 的设计就是为了充分利用这一特性。
-
零依赖
Hono 核心包(
hono)没有任何 npm 运行时依赖。整个核心大小约 14KB(gzip 后 ~5KB)。相比之下,Express 加上常用中间件约 500KB+。在边缘环境中,包大小直接影响部署包体积和冷启动时间。
性能基准:与主流框架对比
以下数据来自 TechEmpower Framework Benchmarks(Round 22)和 Bun 官方基准测试,测试场景为纯 JSON 响应(plaintext/JSON):
| 框架 | 运行时 | req/s | 延迟 p99 | 包大小 |
|---|---|---|---|---|
| Hono | Bun | ~210,000 最快 | ~0.6ms | 14KB |
| Elysia | Bun | ~195,000 | ~0.7ms | ~50KB |
| Hono | Node.js | ~110,000 | ~1.2ms | 14KB |
| Fastify | Node.js | ~95,000 | ~1.5ms | ~200KB |
| Express | Node.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 内置了多种路由器,可根据使用场景切换:
- RegExpRouter(默认):将所有路由编译为一个巨型正则表达式,O(1) 匹配,号称全球最快的 JavaScript HTTP 路由器
- TrieRouter:前缀树路由,适合路由数量极多的场景
- SmartRouter:自动根据路由数量选择最优路由器
- LinearRouter:线性扫描,注册速度最快,适合 Workers 每次冷启动重新注册的场景
完整的 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 的路由系统,掌握从基础路由到嵌套路由器的全部用法。