注意点・パフォーマンス

ランタイム依存の罠、ルータの選び方、cold start、エッジ特有の制約まとめ。

ルータの選択

Hono は3つのルータから選べる:

ルータ速度特徴
RegExpRouter最速正規表現に変換。スマートルーティング
TrieRouter速いTrie 木構造。動的ルートに強い
SmartRouter状況によるRegExpRouter + TrieRouter のフォールバック(既定)
PatternRouter遅めURLPattern API ベース
LinearRouter遅い動的に追加するルートが少ない時に
import { Hono } from "hono/quick"           // RegExpRouter(速い)
// import { Hono } from "hono"               // SmartRouter(既定)
// import { Hono } from "hono/tiny"          // PatternRouter(最小)

const app = new Hono()

cold start を抑える

app.post("/heavy", async (c) => {
  const { lib } = await import("./heavy-lib")    // 動的 import
  return c.json(lib.process(...))
})

エッジ環境の制限

Cloudflare Workers / Vercel Edge / Deno Deploy 等のエッジでは:

代替: Web Crypto / WebAssembly / 外部サービス(R2, KV, D1)を使う。

ストリーミング

大きなレスポンスはストリーミングで。basics 参照。 メモリに全部載せず、生成しながら送る。

キャッシュ戦略

並列リクエスト

外部 API を複数叩く時は Promise.all:

app.get("/dashboard", async (c) => {
  const [user, posts, notifications] = await Promise.all([
    fetch(...).then(r => r.json()),
    fetch(...).then(r => r.json()),
    fetch(...).then(r => r.json()),
  ])
  return c.json({ user, posts, notifications })
})

レスポンス遅延を減らすテク

エラーハンドリング

import { HTTPException } from "hono/http-exception"

app.onError((err, c) => {
  if (err instanceof HTTPException) {
    return err.getResponse()
  }
  // それ以外は 500
  console.error(err)
  return c.json({ error: "Internal Server Error" }, 500)
})

// ハンドラ内で
throw new HTTPException(404, { message: "Not Found", res: c.notFound() })

Sentry 等のエラー監視

import * as Sentry from "@sentry/cloudflare"

app.onError((err, c) => {
  Sentry.captureException(err)
  return c.json({ error: "Server error" }, 500)
})

ログ

セキュリティ

OpenAPI でクライアント生成

@hono/zod-openapiOpenAPI スキーマを出して、 他言語クライアント(Swift / Kotlin / Python)を openapi-generator で生成できる。

よくある落とし穴

パフォーマンスの計測

テストのコツ

学び方

- 公式ドキュメントが秀逸
- example レポジトリを読む(github.com/honojs/examples
- 1度作ったら複数ランタイムに移植してみると Hono の真価が分かる