# 运行时选择

URL: https://caijiao.org/hono/01-intro/03-runtime-choice
Source: docs/hono/01-intro/03-runtime-choice.md
Description: 对比 Hono 在 Node.js、Cloudflare Workers、Bun、Deno 等运行时中的入口写法、部署方式和适用场景。

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 服务再迁移。
