运行时选择
Hono 的核心代码接近 Web Standards,但每个运行时仍然有不同的入口、部署方式和平台能力。选运行时之前,先看项目要部署在哪里,而不是先写代码。
常见运行时对比
| 运行时 | 适合场景 | 入口特点 |
|---|---|---|
| Cloudflare Workers | 边缘 API、Webhook、轻量 BFF、静态资源旁路 API | 默认导出 Hono 应用或导出 fetch: app.fetch。 |
| Node.js | 传统服务器、内网服务、现有 Node 生态集成 | 使用 @hono/node-server 的 serve()。 |
| Bun | 快速开发、Bun 原生项目、小型服务 | 可直接使用 Bun 的 Fetch 服务器能力。 |
| Deno | Deno 项目、权限模型清晰的脚本服务 | 使用 Deno 模板和 npm/JSR 生态。 |
| Vercel/Netlify | Serverless API、前端项目配套 API | 使用对应平台模板或适配入口。 |
优先选择 Cloudflare Workers 的情况
- 接口主要服务全球用户,延迟敏感。
- 服务无状态,主要调用 KV、D1、R2、外部 API 或其他边缘绑定。
- 你希望把静态资产和 API 部署在同一个边缘平台。
- 业务可以接受 Workers 的 CPU、连接和运行时限制。
Cloudflare Workers 中常见入口:
import { Hono } from 'hono'
type Bindings = {
API_TOKEN: string
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/env', (c) => {
return c.text(c.env.API_TOKEN)
})
export default app
优先选择 Node.js 的情况
- 项目依赖 Node.js 原生模块、长连接、后台任务或已有 Node 基础设施。
- 需要接入传统数据库连接池、消息队列、APM 或内部部署平台。
- 团队已经熟悉 PM2、Docker、Kubernetes、Nginx 等部署方式。
Node.js 中需要显式启动服务:
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
const app = new Hono()
app.get('/health', (c) => c.json({ ok: true }))
serve({
fetch: app.fetch,
port: 3000,
})
运行时代码如何隔离
建议把业务路由与平台入口拆开:
src/
├─ app.ts
├─ node.ts
└─ worker.ts
app.ts 放 Hono 应用:
import { Hono } from 'hono'
export const app = new Hono()
app.get('/', (c) => c.text('Hello Hono'))
node.ts 只负责 Node.js 启动:
import { serve } from '@hono/node-server'
import { app } from './app'
serve(app)
worker.ts 只负责 Workers 导出:
import { app } from './app'
export default app
这种拆法能让测试更容易,也方便以后迁移运行时。
选择建议
如果你只是学习 Hono,先用 Node.js 模板,调试直观。如果你的目标是边缘 API,直接用 Cloudflare Workers 模板,不要先写成传统 Node.js 服务再迁移。
相关内容
- Hono 是什么 介绍 Hono 的定位、核心特点、Web Standards 思路、多运行时能力,以及它与传统 Node.js Web 框架的差异。
- 安装和 Hello World 学习使用 create-hono 创建 Hono 项目,分别了解通用模板和 Node.js 模板的 Hello World 写法。
- 路由基础 学习 Hono 的 GET、POST、动态参数、通配符、路由分组和模块化路由写法。
- Context 详解 介绍 Hono Context 的 req、json、text、html、redirect、header、status、set、get 等常用 API。
- 中间件机制 学习 Hono 中间件的执行顺序、自定义中间件写法、路径匹配、next 调用和常见使用场景。
- 错误处理 学习 Hono 中的 notFound、onError、HTTPException、自定义错误响应和接口错误设计。