結論
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とエラー内容が返ります。バリデーション対象は json、form、query、header、param、cookie と多彩です。
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で運営しています。安定した高速サーバーで快適にブログを書けています。いつもありがとう!!![]()

コメント