F FisherHub Docs

01. 入门指南

Hono 是一个轻量级 TypeScript Web 框架,专为边缘计算环境设计。它支持 Cloudflare Workers、Deno、Bun、Node.js 等多种运行时,以极小的体积和出色的性能著称。

Hono 的核心特点

  • 超轻量:核心包仅约 14KB,无额外依赖。
  • 多运行时:同一份代码可运行在 Cloudflare Workers、Deno、Bun、Node.js 之上。
  • 内置 TypeScript 支持:完整的类型推导,编辑器体验流畅。
  • 丰富的中间件生态:提供认证、校验、缓存等开箱即用的中间件。
  • 高性能路由:基于 Trie 树的路由匹配算法,路由注册和查找都很快。

环境准备

确保你已安装 Bun 运行时。Bun 是一个兼具 JavaScript 运行时和包管理器功能的工具。

# 检查 Bun 版本
bun --version

如果没有安装,可以执行以下命令:

curl -fsSL https://bun.sh/install | bash

创建项目

使用 Hono 的官方脚手架工具初始化项目:

bun create hono my-app

在模板选择界面中,选择 cloudflare-workers 模板(你也可以根据需要选择其他模板)。创建完成后进入目录:

cd my-app

项目的目录结构如下:

my-app/
├── src/
│   └── index.ts        # 应用入口
├── package.json
├── tsconfig.json
└── wrangler.toml       # Cloudflare Workers 配置

第一个路由

打开 src/index.ts,你会看到类似下面的代码:

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => {
  return c.text('Hello Hono!')
})

export default app

这段代码做了三件事:

  1. hono 包导入 Hono 类。
  2. 创建一个 app 实例。
  3. 注册一个 GET 路由 /,返回纯文本响应。

运行开发服务器:

bun run dev

访问 http://localhost:8787,你应该能看到 Hello Hono!

返回 JSON

API 接口通常返回 JSON 格式的数据。使用 c.json() 方法:

app.get('/api/hello', (c) => {
  return c.json({
    message: '你好,世界',
    timestamp: Date.now(),
  })
})

处理请求参数

查询参数 (Query)

客户端通过 URL 问号后的参数传参:

app.get('/search', (c) => {
  const q = c.req.query('q')
  const page = c.req.query('page') || '1'
  return c.json({ keyword: q, page: Number(page) })
})

访问 /search?q=hono&page=2,返回:

{ "keyword": "hono", "page": 2 }

路径参数 (Param)

路径中的动态部分用冒号声明:

app.get('/users/:id', (c) => {
  const id = c.req.param('id')
  return c.json({ userId: id })
})

请求体 (Body)

POST 请求需要从请求体中读取数据:

app.post('/users', async (c) => {
  const body = await c.req.json()
  // body 类型为 unknown,需要自行校验
  const name = (body as { name: string }).name
  return c.json({ created: true, name }, 201)
})

返回 HTML

Hono 也可以直接返回 HTML 内容:

app.get('/about', (c) => {
  return c.html(`
    <html>
      <head><title>关于我们</title></head>
      <body>
        <h1>欢迎使用 Hono</h1>
        <p>这是一个轻量级 Web 框架。</p>
      </body>
    </html>
  `)
})

完整的示例

下面是一个综合示例,涵盖了常见的请求处理场景:

import { Hono } from 'hono'

const app = new Hono()

// 健康检查
app.get('/health', (c) => {
  return c.json({ status: 'ok', uptime: process.uptime() })
})

// 获取用户列表
app.get('/api/users', (c) => {
  const page = c.req.query('page') || '1'
  const limit = c.req.query('limit') || '10'
  return c.json({
    data: [],
    page: Number(page),
    limit: Number(limit),
  })
})

// 创建用户
app.post('/api/users', async (c) => {
  const body = await c.req.json()
  return c.json({ id: Date.now(), ...body }, 201)
})

// 获取单个用户
app.get('/api/users/:id', (c) => {
  const id = c.req.param('id')
  // 模拟数据库查询
  return c.json({ id, name: '用户 ' + id })
})

export default app

小结

通过本文你已经学会了:

  • Hono 的核心特点和适用场景。
  • 使用 bun create hono 快速初始化项目。
  • 注册 GET 和 POST 路由。
  • 处理查询参数、路径参数和请求体。
  • 返回 JSON 和 HTML 格式的响应。

下一篇文章将介绍路由的高级用法和中间件机制。