教程 hono tutorial

运行时选择

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 中常见入口:

ts
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 中需要显式启动服务:

ts
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,
})

运行时代码如何隔离

建议把业务路由与平台入口拆开:

text
src/
├─ app.ts
├─ node.ts
└─ worker.ts

app.ts 放 Hono 应用:

ts
import { Hono } from 'hono'

export const app = new Hono()

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

node.ts 只负责 Node.js 启动:

ts
import { serve } from '@hono/node-server'
import { app } from './app'

serve(app)

worker.ts 只负责 Workers 导出:

ts
import { app } from './app'

export default app

这种拆法能让测试更容易,也方便以后迁移运行时。

选择建议

如果你只是学习 Hono,先用 Node.js 模板,调试直观。如果你的目标是边缘 API,直接用 Cloudflare Workers 模板,不要先写成传统 Node.js 服务再迁移。