【OSS】超軽量Webフレームワーク「Hono」完全入門ガイド2026 — Node.js/Cloudflare Workers/Deno/Bun対応REST API開発

目次

結論

Hono(炎)は、Web標準ベースの超軽量TypeScript/JavaScriptフレームワークです。Node.js、Cloudflare Workers、Deno、Bunなど、あらゆるJavaScriptランタイムで動作します。インストールからAPI公開まで、たった3ステップで完了します。

npm create hono@latest my-api
cd my-api && npm i
npm run dev    `# http://localhost:3000

これだけでREST APIサーバーが立ち上がります。コードは以下のような感じです。

import { serve } from "@hono/node-server"
import { Hono } from "hono"

const app = new Hono()

app.get("/", (c) => c.text("Hello Hono!"))
app.get("/api/hello", (c) => c.json({ ok: true, message: "Hello Hono!" }))
app.post("/posts", (c) => c.text("Created!", 201))

serve({ fetch: app.fetch, port: 3000 })

この記事では、Hono v4.13.x(2026年9月最新)を対象に、インストールから実践的なAPI開発、各ランタイムへのデプロイまでを解説します。

Honoって何?なぜ今注目なの?

Honoは、日本のエンジニアYusuke Wada氏によって開発されたWebフレームワークです。名前は日本語の「炎」が由来で、その名の通り爆速で軽量なのが特徴です。

何よりの魅力は「Web標準ベース」であること。ExpressやFastifyのようにNode.js専用ではなく、Cloudflare Workers、Deno、Bun、Node.js — どのランタイムでも同じコードが動きます。つまり、一度書けばどこでも動くわけですね。

サイズはなんと12KB未満。依存関係も実質ゼロです。ベンチマークではExpressの50倍以上、Fastifyの2倍以上のスループットを叩き出しています。

2026年現在、HonoはCloudflare Workersのデファクトフレームワークとして広く認知され、GitHubスターは3万を超えています。

インストールとプロジェクト作成

create-hono で一発作成

スターターテンプレートを使ってプロジェクトを作成します。

npm create hono@latest my-app

テンプレートを選べと言われるので、使いたいランタイムに合わせて選びます。

? Which template do you want to use?
  aws-lambda
  bun
  cloudflare-pages
❯ cloudflare-workers
  deno
  nodejs
  vercel

プロジェクトができたら依存関係をインストールして開発サーバーを起動します。

cd my-app && npm i
npm run dev

手動セットアップ(Node.js)

既存のプロジェクトに追加する場合はこちら。

npm install hono @hono/node-server

基本ルーティング

Honoのルーティングは直感的です。メソッドチェーンでパスを指定して、ハンドラを渡すだけ。

GET・POST・PUT・DELETE

import { Hono } from "hono"

const app = new Hono()

app.get("/users", (c) => {
  return c.json({ users: ["Alice", "Bob"] })
})

app.post("/users", async (c) => {
  const body = await c.req.json()
  return c.json({ ok: true, data: body }, 201)
})

app.put("/users/:id", (c) => {
  return c.text("User " + c.req.param("id") + " updated")
})

app.delete("/users/:id", (c) => {
  return c.text("User " + c.req.param("id") + " deleted")
})

パスパラメータとクエリ

c.req.param() でパスパラメータ、c.req.query() でクエリ文字列を取得できます。

app.get("/posts/:id", (c) => {
  const id = c.req.param("id")       // /posts/42 -> "42"
  const page = c.req.query("page")   // ?page=3 -> "3"
  const tag = c.req.query("tag")     // &tag=tech -> "tech"

  return c.json({ id, page, tag })
})

グループルーティング

パスが増えてきたら app.route() でグルーピングすると見通しが良くなります。

const books = new Hono()

books.get("/", (c) => c.json({ books: [] }))
books.post("/", (c) => c.text("Created", 201))
books.get("/:id", (c) => c.json({ id: c.req.param("id") }))

app.route("/api/books", books)

これで /api/books/api/books/123 などのエンドポイントを一気に生やせます。

ミドルウェア

Honoには必要なミドルウェアが最初からバンドルされています。Basic認証、CORS、JWT、Bearer認証、CSRF保護 — 全部ビルトインです。

Basic認証

import { basicAuth } from "hono/basic-auth"

app.use("/admin/*", basicAuth({
  username: "admin",
  password: "secret",
}))

app.get("/admin", (c) => {
  return c.text("You are authorized!")
})

認証なしで /admin にアクセスすると、自動で401が返ります。

CORS

import { cors } from "hono/cors"

app.use("/api/*", cors({
  origin: "https://example.com",
  allowMethods: ["GET", "POST", "PUT", "DELETE"],
}))

JWT認証

import { jwt } from "hono/jwt"

app.use("/api/protected/*", jwt({
  secret: "my-secret-key",
}))

app.get("/api/protected/data", (c) => {
  const payload = c.get("jwtPayload")
  return c.json({ user: payload })
})

バリデーション(Zod統合)

リクエストバリデーションにはZodを組み合わせるのが鉄板です。@hono/zod-validator を使うと、型安全なバリデーションをミドルウェアとして挿入できます。

import { z } from "zod"
import { zValidator } from "@hono/zod-validator"

const createUserSchema = z.object({
  name: z.string().min(2).max(50),
  email: z.string().email(),
  age: z.number().int().min(0).optional(),
})

app.post("/users", zValidator("json", createUserSchema), (c) => {
  const user = c.req.valid("json")
  return c.json({ ok: true, data: user }, 201)
})

バリデーションに失敗すると自動で400とエラー内容が返ります。バリデーション対象は jsonformqueryheaderparamcookie と多彩です。

const querySchema = z.object({
  page: z.coerce.number().int().positive(),
  limit: z.coerce.number().int().min(1).max(100).default(10),
})

app.get("/items", zValidator("query", querySchema), (c) => {
  const { page, limit } = c.req.valid("query")
  return c.json({ page, limit, items: [] })
})

静的ファイル配信とJSXテンプレート

静的ファイル

Node.jsでは serveStatic を使って静的ファイルを配信できます。

import { serveStatic } from "@hono/node-server/serve-static"

app.use("/static/*", serveStatic({ root: "./" }))

JSXでHTML生成

HonoはJSXもサポートしています。.tsx ファイルで書けば、サーバーサイドレンダリングも簡単です。

const Layout = ({ children }: { children: any }) => {
  return (
      {children}
    
  )
}

app.get("/", (c) => {
  return c.html(
    

Hello Hono!



    
  )
})

各ランタイムでのデプロイ

Honoの真価は、同じコードがほぼそのまま各ランタイムで動くことです。エントリポイントだけ変えればOK。

Node.js

import { serve } from "@hono/node-server"
import { Hono } from "hono"

const app = new Hono()
app.get("/", (c) => c.text("Hello Hono!"))

serve({ fetch: app.fetch, port: 3000 })

Cloudflare Workers

import { Hono } from "hono"

const app = new Hono()
app.get("/", (c) => c.text("Hello Hono!"))

export default app

たったこれだけ。serve() が不要で、export default app にするだけです。wranglerでデプロイすればそのまま動きます。

Deno

import { Hono } from "https://deno.land/x/hono/mod.ts"

const app = new Hono()
app.get("/", (c) => c.text("Hello Hono!"))

Deno.serve(app.fetch)

Bun

import { Hono } from "hono"

const app = new Hono()
app.get("/", (c) => c.text("Hello Hono!"))

export default app

Bunの組み込みHTTPサーバーが自動でHonoを認識します。設定ファイルいらずで動くのは気持ちいいですね。

まとめ

Honoは「書いたらどこでも動く」という理想を、本当に実現したフレームワークです。12KB未満の軽量ボディに、ルーティング、ミドルウェア、バリデーション、JSX — 開発に必要なものが全部揃っています。

Expressからの乗り換えも簡単です。同じWeb標準ベースのAPI設計なので、学習コストはほぼゼロ。実際に手を動かしてみると、その速さとシンプルさに驚くと思いますよ。

まずは npm create hono@latest でプロジェクトを作って、動かしてみてください。5分後にはAPIができているはず。

【広告】このサイトはConoHa WINGで運営しています。安定した高速サーバーで快適にブログを書けています。いつもありがとう!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次