Hono 接管 Next API
- 可使用Hono接管Next Route
- Next.js自带的api路由比较难用,通过hono接管Next API
- Next.js会将所有/api/*请求的路由让hono来接管处理
- hono的路由,嵌入在Next所在的
api路径下 - 通过
hono/vercel来负责接管,接管之后,按照hono的方式来写api
- hono的路由,嵌入在Next所在的
路由解析、中间件、响应有hono接管
好处:
- 统一 API 组织方式:把后端按 Hono 子路由模块化管理,而不是分散很多 Next route 文件
- 端到端类型安全:
AppType -> hc<AppType>,前后端共享路由类型,减少手写 URL 和类型不一致问题 - 保留 Next 生态能力(部署、App Router、前端 SSR/CSR),同时用 Hono 提升 API 层开发体验
接管API路由
当使用hono/vercel适配器时,Hono通过Next.js的动态捕获路由机制(如app/api/[...hono]/route.ts)拦截所有/api/*请求路径,将这些请求的处理权从Next.js原生路由系统转移到Hono的路由引擎。这种接管包含三个关键特征:
- 路径映射保留
前端调用的接口地址(如
/api/users/123)在视觉上与Next.js原生API路由完全一致,但底层处理逻辑已切换为Hono的路由匹配规则。 - 运行时控制权转移 Next.js仅作为请求代理,实际路由解析、中间件执行、响应生成均由Hono完成。例如:
// Next.js路由文件仅作为转发入口
export const GET = handle(app); // 将GET请求交给Hono实例处理
- 兼容性隔离层
Vercel适配器(
hono/vercel)负责处理Next.js的Request/Response对象与Hono的Context对象之间的转换,确保两者运行时模型的无缝衔接。
相关实现
- src/app/api/[[...route]]/route.ts
- 是服务端api桥接层
- 通过new Hono().basePath('/api') 统一 API 根前缀
import { chat, sse, user } from '@/server/routes'
import { Hono } from 'hono'
import { handle } from 'hono/vercel'
# 统一 API 根前缀
const app = new Hono().basePath('/api')
export const runtime = 'edge'
# 把各业务路由挂到 /api/chat、/api/user、/api/sse
const routes = app.route('/chat', chat).route('/user', user).route('/sse', sse)
export const GET = handle(app)
export const POST = handle(app)
# 来自服务端路由类型
export type AppType = typeof routes
-
src/lib/client.ts
-
hc 是 Hono 提供的客户端生成器(hono/client)
-
服务端路由类型(AppType)变成一个可直接调用的前端 API 对象
-
生成前端 API 客户端,自动继承当前域名并获得类型提示
-
调用api:client.api.xxx使用
- 如 await client.api.user.list.$get()
-
import type { AppType } from '@/app/api/[[...route]]/route'
import { hc } from 'hono/client'
// 自动会继承当前域名作为api接口地址
export const client = hc<AppType>('/')