Hono RPC
Hono 内置的 RPC 能力 —— 基于 hc 客户端,零代码生成即可实现服务端到客户端的端到端类型安全调用,是轻量 Web 框架向全栈类型化 API 演进的典型方案。
Hono RPC 是 Hono 框架内置的 RPC 能力,通过 hc 客户端实现零代码生成的端到端类型安全调用。支持 Cloudflare Workers/Deno/Bun/Node.js 等多运行时环境,保留标准 REST 语义。GitHub 31,300+ Stars,npm 周下载量超 2000 万,是 Edge/Serverless 场景增长最快的框架之一。
Hono RPC
Hono 内置的 RPC 能力 —— 基于
hc客户端,零代码生成即可实现服务端到客户端的端到端类型安全调用,是轻量 Web 框架向全栈类型化 API 演进的典型方案。
技术简介
Hono(日语「炎」,意为"火焰")是一个基于 Web Standards 构建的超轻量 HTTP 框架,由 Yusuke Wada 于 2021 年创建。其核心设计目标是:零依赖、多运行时、高性能、极致的 TypeScript 类型推导体验。Hono 本身是一个完整的 Web 框架(路由、中间件、验证、SSR/SSG),但其 RPC 能力(从 v4 开始大幅强化)是它区别于 Express、Fastify 等传统框架的关键差异化特性。
Hono RPC 的工作原理非常简洁:服务端定义路由并导出类型(export type AppType = typeof route),客户端通过 hc<AppType>(baseUrl) 即可获得与后端完全一致的请求/响应类型推导 —— 无需代码生成、无需 OpenAPI Schema、无需额外构建步骤。这种模式与 tRPC 类似,但 Hono 同时保留了标准 REST 语义和 HTTP 协议,不要求客户端必须使用 TypeScript,对外部消费者也更友好。
截至 2026 年中,Hono 已发展到 v4.12.28,GitHub Stars 超过 31,300,npm 周下载量超过 2000 万,成为 Edge / Serverless 场景增长最快的 Web 框架之一。其 RPC 能力被大量全栈项目采用,尤其在 Cloudflare Workers + Next.js/Nuxt/SvelteKit 的组合中非常流行。
基本信息
| 项目 | 说明 |
|---|---|
| 官方网站 | https://hono.dev |
| GitHub | https://github.com/honojs/hono |
| npm | https://www.npmjs.com/package/hono |
| License | MIT |
| 最新版本 | v4.12.28(2026 年 7 月 6 日发布) |
| Node.js 适配 | @hono/node-server v2.0.4 |
| 创建者 / 维护者 | Yusuke Wada(https://github.com/yusukebe),Cloudflare 工程师 |
| GitHub Stars | 31,300+(2026 年 7 月) |
| npm 周下载量 | 20,000,000+(2026 年) |
| 运行时要求 | Node.js 18+(Node 场景);零外部依赖 |
| 包体积 | ~14KB(minified + gzipped) |
快速上手
1. 安装
# 服务端(Hono 核心)
npm install hono
# 可选:Node.js 适配器(如果不在 Edge 环境)
npm install @hono/node-server
# 可选:Zod 验证器(RPC 类型推导的最佳搭档)
npm install @hono/zod-validator zod2. 服务端 —— 定义路由并导出类型
// server.ts
import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'
const app = new Hono()
// 定义路由 + 验证器 + 处理函数,赋值给变量
const route = app
.post('/api/posts', zValidator('json', z.object({
title: z.string().min(1),
body: z.string(),
})), async (c) => {
const data = await c.req.valid('json')
// ... 业务逻辑
return c.json({
id: 1,
title: data.title,
body: data.body,
createdAt: new Date().toISOString(),
}, 201)
})
// 关键:导出路由类型供客户端使用
export type AppType = typeof route
export default app3. 客户端 —— 使用 hc 类型安全调用
// client.ts
import { hc } from 'hono/client'
import type { AppType } from './server'
// 创建类型安全客户端
const client = hc<AppType>('http://localhost:8787')
// 调用 API —— 参数和返回值均有完整类型推导
const res = await client.api.posts.$post({
json: {
title: 'Hello Hono RPC',
body: '类型安全,零代码生成',
},
})
// 响应类型也被推导 —— 根据状态码区分
if (res.status === 201) {
const data = await res.json()
console.log(data.title) // 类型推导为 string
console.log(data.id) // 类型推导为 number
}
// 辅助工具:获取 URL
const url = client.api.posts.$url()
// => URL { href: 'http://localhost:8787/api/posts' }
// 辅助工具:仅获取路径
const path = client.api.posts.$path()
// => '/api/posts'核心概念与架构
hc 客户端
hc 是 Hono 内置的 RPC 客户端(从 hono/client 导入),核心机制:
- 类型读取:接收
AppType泛型参数,从服务端路由定义中提取完整的请求/响应类型 - 链式调用:路径通过点语法映射 ——
client.api.users[':id'].$get({ param: { id: '1' } }) - 标准 fetch:底层基于
fetch(),返回值就是标准Response对象 - HTTP 方法映射:
$get()、$post()、$put()、$delete()、$patch()对应服务端路由方法
类型推导机制
服务端路由定义
↓
TypeScript 泛型类型链(InferRequestType / InferResponseType)
↓
hc<AppType> 客户端获得完整类型
↓
请求参数(json / form / query / param / header)→ 编译期检查
响应体 + 状态码 → 编译期推导 + 分支收窄
关键类型工具:
| 工具 | 用途 |
|---|---|
InferRequestType<typeof route> | 提取请求参数类型 |
InferResponseType<typeof route> | 提取响应体类型 |
ApplyGlobalResponse | 合并全局错误响应类型到所有路由 |
Validator 的角色
验证器是 Hono RPC 类型推导的桥梁 —— 输入类型从验证器 Schema 推导,而非手动定义:
// 使用 Zod 验证器 → 输入类型自动推导
zValidator('json', z.object({ name: z.string() }))
// 使用 Standard Schema(通用标准,支持 Zod / Valibot / ArkType 等)
import { standardValidator } from '@hono/standard-validator'核心特性
1. 零代码生成的端到端类型安全
无需 openapi-typescript、无需 codegen,仅通过 TypeScript 类型导出/导入即可实现完整的请求/响应类型推导。
2. 多运行时支持(Write Once, Run Anywhere)
同一份代码可运行于:
- Cloudflare Workers / Pages
- Deno / Deno Deploy
- Bun
- Node.js(通过
@hono/node-server) - AWS Lambda / Lambda@Edge
- Fastly Compute
- Vercel / Netlify
3. REST 语义保留
与 tRPC 不同,Hono RPC 基于标准 HTTP + REST,外部非 TypeScript 客户端(curl、Postman、移动 App)可以正常调用,不要求客户端必须使用 TypeScript。
4. 状态码分支推导
服务端使用 c.json(data, 200) / c.json(error, 404) 指定不同状态码时,客户端可根据 res.status 分支收窄响应类型。
5. 内置丰富中间件
开箱即用的官方中间件:CORS、JWT、Bearer/Basic Auth、Cookie、Cache、ETag、Compress、Logger、Pretty JSON、Secure Headers、Body Limit、Context Storage、SSG、Streaming 等。
6. 验证器生态
支持 Zod(@hono/zod-validator)、Standard Schema(@hono/standard-validator)、Valibot、ArkType,以及 @hono/zod-openapi(验证 + OpenAPI 文档生成)。
7. 自定义 Fetch 支持
hc 可注入自定义 fetch 函数,适配 Cloudflare Workers 的 env.fetch、Node.js 的 undici、或添加认证 header 的包装函数。
8. 前端框架集成
与 SWR、React Query、Vue Query、SvelteKit 等无缝集成 —— 将 hc 调用包装为 fetcher 即可获得缓存、重试、乐观更新等能力。
9. 路由分组与挂载
支持 app.route() 嵌套路由、app.mount() 挂载子应用,类型在分组后仍然保持完整推导。
10. 极小体积与极高性能
核心包 ~14KB,零外部依赖;使用 RegExpRouter / LinearRouter 等多种路由策略,冷启动极快,适合 Edge 场景。
生态图
┌─────────────────────────────────────────────────────────┐
│ Hono 生态 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─ 核心 ──────────────────────────────────────────────┐ │
│ │ hono(核心框架) │ │
│ │ @hono/node-server(Node.js 适配器) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 验证层 ────────────────────────────────────────────┐ │
│ │ @hono/zod-validator Zod 验证 │ │
│ │ @hono/standard-validator Standard Schema 验证 │ │
│ │ @hono/zod-openapi Zod + OpenAPI 文档生成 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 认证中间件 ────────────────────────────────────────┐ │
│ │ Basic Auth / Bearer Auth / JWT Auth │ │
│ │ Firebase Auth / Clerk Auth │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 运行时适配器 ──────────────────────────────────────┐ │
│ │ Cloudflare Workers │ Deno / Deno Deploy │ │
│ │ Bun │ AWS Lambda / Lambda@Edge │ │
│ │ Fastly Compute │ Vercel / Netlify │ │
│ │ Node.js │ Service Worker │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 工具中间件 ────────────────────────────────────────┐ │
│ │ CORS │ ETag │ Cache │ Compress │ Logger │ │
│ │ Cookie │ Secure Headers │ Body Limit │ Pretty JSON │ │
│ │ SSG │ Streaming │ Context Storage │ JSX / html │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 第三方集成 ────────────────────────────────────────┐ │
│ │ GraphQL Server(graphql-yoga)│ Sentry │ │
│ │ Prisma │ Drizzle ORM │ D1 / KV / R2 │ │
│ │ Pino │ Winston(日志) │ BullMQ(队列) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 前端集成 ──────────────────────────────────────────┐ │
│ │ SWR / React Query / Vue Query / SvelteKit │ │
│ │ Next.js App Router / Nuxt / Astro / SolidStart │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
适用场景
1. Edge / Serverless API 服务
Cloudflare Workers、Deno Deploy、Vercel Edge Functions 等边缘场景的首选框架,冷启动快、体积小、天然支持 RPC。
2. 全栈 TypeScript 项目
前后端共享类型但不想引入 tRPC 的复杂度时,Hono RPC 提供更轻量、更贴近 REST 的方案。适合 monorepo(Turborepo / pnpm workspace)架构。
3. 微服务 / API 网关
多运行时支持使得同一套代码可以部署到不同平台(Workers 做边缘路由、Lambda 做核心业务),RPC 客户端确保服务间调用的类型安全。
4. BFF(Backend For Frontend)层
在 Next.js / Nuxt / Astro 的服务端层使用 Hono 聚合后端 API,通过 RPC 将类型安全传递到前端组件。
5. 内部工具 / 管理后台
需要快速搭建带类型安全的 CRUD 管理接口,Hono + Zod 验证 + hc 客户端可以零 Schema 定义实现完整类型链。
6. SaaS API 后端
面向外部开发者的 API 服务,结合 @hono/zod-openapi 可同时获得验证 + OpenAPI 文档,降低维护成本。
7. 代理 / 中间层服务
利用 Hono 的中间件能力和多运行时适配,构建认证代理、请求转换、限流等中间层服务。
开发与工程化
TypeScript 严格模式
Hono 本身用 TypeScript 编写,天然支持 strict: true。RPC 模式在严格模式下效果最佳。
Monorepo 推荐结构
packages/
api/ ← Hono 服务端(定义路由 + 导出 AppType)
web/ ← 前端应用(引用 AppType,使用 hc 客户端)
shared/ ← 共享类型、常量
构建工具
- 开发:
wrangler dev(Workers)、tsx watch(Node.js)、bun --hot(Bun) - 生产:
wrangler deploy、node dist/index.js、Bun 原生编译 - Vite 插件:
@hono/vite-dev-server提供开发热更新
测试
- vitest 配合
app.request()方法可直接对路由做单元测试,无需启动服务器:
import { describe, it, expect } from 'vitest'
import app from './server'
describe('Posts API', () => {
it('should create a post', async () => {
const res = await app.request('/api/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'Test', body: 'Content' }),
})
expect(res.status).toBe(201)
const data = await res.json()
expect(data.title).toBe('Test')
})
})类型推导性能优化
当路由数量庞大时(100+ 路由),TypeScript 编译时间可能显著增长。缓解策略:
- 保持 monorepo 中 Hono 版本一致
- 使用 TypeScript Project References
- 预编译客户端类型以缓存实例化结果
- 手动指定泛型参数减少推导开销
- 将大型应用拆分为多个独立的客户端文件
性能与安全
性能
| 指标 | 数据 |
|---|---|
| 包体积 | ~14KB(gzipped),零依赖 |
| 路由策略 | RegExpRouter(默认,正则匹配)、LinearRouter(线性扫描)、SmartRouter(自适应)、TrieRouter(字典树) |
| 冷启动 | 极快,适合 Edge / Serverless |
| v4.12 改进 | 路由速度提升 2 倍,JSON 响应序列化优化 |
| 基准测试 | TechEmpower 等榜单表现优异,Cloudflare Workers 上延迟通常在 1ms 以内 |
安全
| 方面 | 说明 |
|---|---|
| CVE-2026-24398 | IP 限制中间件漏洞,v4.11.7+ 已修复 |
| JWT / JWK | 内置 JWT 认证中间件,v4.12.25+ 修复了多个序列化安全问题 |
| CORS / Secure Headers | 内置中间件,开箱即用 |
| Body Limit | 请求体大小限制中间件 |
| IP 限制 | IP Restriction 中间件(需确保版本 ≥ v4.11.7) |
| Cookie 序列化 | v4.12.26 修复了 Cookie 序列化安全问题 |
mount() 安全 | v4.12.25 修复了 mount() 相关安全问题 |
建议:生产环境使用最新 v4.12.x 版本,至少 ≥ v4.11.7 以规避已知安全漏洞。
技术对比
Hono RPC vs tRPC vs ts-rest vs oRPC
| 维度 | Hono RPC | tRPC | ts-rest | oRPC |
|---|---|---|---|---|
| 核心定位 | 轻量 HTTP 框架 + 内置 RPC | 端到端类型安全 RPC 框架 | 类型安全 REST 客户端 | RPC + REST 兼容 |
| 类型安全 | ✅ 通过 AppType 推导 | ✅ 完整端到端 | ✅ 通过 contract 定义 | ✅ 完整端到端 |
| 代码生成 | 不需要 | 不需要 | 不需要 | 不需要 |
| HTTP 语义 | 标准 REST | 自有协议(非标准 REST) | 标准 REST | REST 兼容 |
| 外部消费者友好 | ✅ 标准 HTTP | ❌ 需 tRPC 客户端 | ✅ 标准 HTTP | ✅ 标准 HTTP |
| 多运行时 | ✅ Workers/Deno/Bun/Node/Lambda | ❌ 主要 Node.js | ✅ 框架无关 | ✅ 框架无关 |
| 包体积 | ~14KB | ~30KB | ~8KB | ~5KB |
| Edge 支持 | ✅ 优秀 | ⚠️ 一般 | ✅ 好 | ✅ 好 |
| OpenAPI 生成 | 需中间件(@hono/zod-openapi) | 需插件 | 内置 | 内置 |
| 社区成熟度 | 快速增长(31K+ stars) | 成熟(44K+ stars) | 较小 | 新兴 |
| 自定义 Procedure | ❌ 不支持 | ✅ 强大 | N/A | ✅ 支持 |
| 最佳场景 | Edge API / 多运行时 / REST 服务 | 全栈 TS monorepo(前后端均 TS) | 需要 REST + 类型安全 | tRPC 体验 + REST 兼容 |
Hono vs Express vs Fastify vs Elysia
| 维度 | Hono | Express | Fastify | Elysia |
|---|---|---|---|---|
| 运行时 | 多运行时 | Node.js | Node.js | Bun only |
| 包体积 | ~14KB | ~800KB+ | ~200KB+ | ~10KB |
| 类型安全 | ✅ 内置 RPC | ❌ 无 | ⚠️ 有限 | ✅ 内置 RPC |
| Edge 部署 | ✅ 原生支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| 插件生态 | 中等(快速增长) | 最成熟 | 成熟 | 较小 |
| 性能 | 极快 | 较慢 | 快 | 极快(Bun) |
| 学习曲线 | 低 | 低 | 中 | 中 |
最佳实践
1. 始终使用验证器
// ✅ 推荐:使用 Zod 验证器,类型自动推导
zValidator('json', postSchema)
// ❌ 避免:手动解析 body,丢失类型推导
const body = await c.req.json()2. 导出路由类型而非 app 实例
// ✅ 推荐:导出具体路由变量类型
const route = app.post('/api/users', handler)
export type AppType = typeof route
// ⚠️ 注意:导出整个 app 的类型可能包含不需要的路由3. 使用 $url() 获取完整 URL
// ✅ 推荐:需要完整 URL 对象
const url = client.api.posts.$url()
// ✅ 推荐:仅需路径
const path = client.api.posts.$path()4. 注入自定义 fetch 实现认证
const client = hc<AppType>('https://api.example.com', {
fetch: (input, init) => {
return fetch(input, {
...init,
headers: {
...init?.headers,
Authorization: `Bearer ${getToken()}`,
},
})
},
})5. 避免 c.notFound() 破坏类型推导
// ✅ 推荐:使用 c.json + 状态码
return c.json({ error: 'Not found' }, 404)
// ❌ 避免:c.notFound() 会中断客户端类型推导
return c.notFound()6. 大型应用拆分客户端
// ✅ 推荐:按模块拆分
import type { UsersType } from './api/users'
import type { PostsType } from './api/posts'
const usersClient = hc<UsersType>('...')
const postsClient = hc<PostsType>('...')7. 配合 SWR / React Query 使用
// 自定义 fetcher
const fetcher = async (key: string) => {
const res = await client.api.posts.$get()
return res.json()
}
// 在组件中使用
const { data } = useSWR('/api/posts', fetcher)技术局限与边界
1. 类型推导性能瓶颈
当路由数量超过 100+ 时,TypeScript 编译时间可能从几秒增长到数分钟(GitHub Issue #3869)。需要主动拆分应用、使用 Project References 缓解。
2. IDE 支持差异
- VS Code:支持最好,类型推导完整
- WebStorm:存在已知的类型推导问题(WEB-69009),复杂路由可能显示 "Analyzing" 卡住
3. 不支持自定义 Procedure
与 tRPC 不同,Hono RPC 没有类似 tRPC procedure 的中间件抽象层。无法像 tRPC 那样定义 authedProcedure 等可复用的 Procedure 链。
4. unknown 类型推导为 never
当路由返回值中包含 unknown 类型属性时,客户端可能将其推导为 never(GitHub Issue #4368)。
5. 全局错误处理器类型不自动推导
app.onError() 定义的全局错误响应不会被客户端自动推导,需要使用 ApplyGlobalResponse 手动合并。
6. 抽象路由的类型推导限制
使用工厂函数创建抽象路由时,RPC 客户端可能无法获得完整类型提示。
7. 非 TypeScript 客户端无类型安全
Hono RPC 的类型推导完全依赖 TypeScript 类型系统。JavaScript 客户端、curl、Postman 等无法享受类型安全(但 API 仍可正常调用)。
学习资源
官方资源
博客与文章
| 资源 | 说明 |
|---|---|
| Hey, this is Hono's RPC | Yusuke Wada 亲笔,讲解 RPC 设计理念 |
| Hono RPC Complete Guide 2026 | 2026 年完整 RPC 指南 |
| Type Safety Without Code Generation | freeCodeCamp,对比 tRPC 与 Hono |
| Hono vs tRPC vs oRPC | supastarter,2026 年 API 层对比 |
| Hono vs Express vs Fastify 2025 | Level Up Coding,Next.js 架构指南 |
视频
| 资源 | 说明 |
|---|---|
| AWS re:Invent 2025 - Supercharge Lambda with Hono | AWS 官方,Lambda + Hono |
| Hono.js in 2026 | 2026 年 Hono 现状分析 |
| The Creator of Hono on Bringing It to Node.js | 创作者 Yusuke Wada 访谈 |
| The Story of Web Framework Hono | Cloudflare 官方博客,Hono 创立故事 |
2026 年现状
框架版本与生态
- 最新版本:v4.12.28(2026-07-06),持续活跃发布
- GitHub Stars:31,300+,是 2024 年同期的 1.5 倍
- npm 周下载量:20,000,000+,进入 JS 生态框架第一梯队
- Node.js 适配器:
@hono/node-serverv2.0.4,支持 Node.js 22+
社区与采用
- 知名用户:cdnjs、Cloudflare D1/KV、Unkey、OpenStatus、Clerk、Drivly、repeat.dev
- Zod 4 兼容:
@hono/zod-validator已支持 Zod 4(2025 年发布) - Standard Schema:支持通用验证标准,兼容 Zod / Valibot / ArkType
- 安全维护:2026 年 1 月修复 CVE-2026-24398,持续发布安全补丁
竞争格局
- vs tRPC:tRPC 仍在全栈 TypeScript monorepo 中占主导,但 Hono RPC 在 Edge / 多运行时 / REST 兼容场景中快速替代 tRPC
- vs Elysia:Elysia 在 Bun 上性能略优,但 Hono 的多运行时覆盖和 Edge 部署是决定性优势
- vs Express/Fastify:Hono 在 Edge / Serverless 场景基本取代 Express,传统 Node.js 场景仍由 Express/Fastify 主导
- vs oRPC / ts-rest:新兴竞争者,各有特色,但 Hono 社区增长最快
趋势判断
Hono 在 2026 年已从"新兴框架"进入"主流选择"阶段:
- Edge-first 架构成为云厂商默认推荐,Hono 是此赛道的领导者
- RPC 能力被广泛采用,尤其在前端开发者构建全栈应用时
- AWS re:Invent 2025 官方推荐 Hono 用于 Lambda 开发
- Cloudflare 深度合作,Yusuke Wada 本人是 Cloudflare 工程师
- 社区增长曲线陡峭,预计 2026 年底 GitHub Stars 可能突破 40K