ExpressとHonoを比較してみた
はじめに
バックエンジニアをしている角方です!
最近、Zennや技術記事で「Hono (ホノ)」っていう名前をよく見かけます。
「すごく速くて軽い」「使いやすい」と言われていますが、Expressしか触ったことがないと、正直「何が違うの…?」ってピンと来ませんでした。
そこでこの記事では、ExpressとHonoを比べたとき、何がどう違うのかを自分なりに軽く調べてまとめてみました。 同じようにHonoが気になっている人の参考になれば嬉しいです!
Honoってどんなフレームワーク?
早速Geminiに聞いてみました
Hono(ホノ)は、**「速い・軽い・どこでも動く」**をウリにした、新しいJavaScriptのWebフレームワークです。
Honoの主な特徴
⚡️ とにかく速くて、軽い
難しいライブラリに頼っていない(依存関係ゼロ)ので、動作がとても高速です。特に、プログラムが起動するまでの時間(コールドスタート)が短いため、サーバーレス環境で有利です。
🌐 どこでも動く
Expressが基本的にNode.jsで動くのに対し、Honoは Node.js はもちろん、Bun や Deno、さらには Cloudflare Workers や Vercel Edge Functions といった「エッジ環境」でも同じコードで動きます。
✍️ 書き方がモダン
ブラウザで使われる技術をベースにしているので、一度覚えれば他の環境でも応用が利きやすいです。TypeScriptとの相性も抜群です。
ひとことで言うと、**「Expressのシンプルさは好きだけど、もっと速くて、色々な新しい環境(特にエッジ)で動かしたい!」**という要望に応えてくれるフレームワークです。
「速い・軽い・どこでも動く」がウリのようですね!
特に「速さ」と「書き方」が気になったのでちょっとまとめてみます。
どれくらい速い?
速いって言われても「どれくらい速いんだ」って思うので、しっかり数字で出しましょう。
以下のベンチマークを見てみると…
2025年11月時点で
| Express | Hono |
|---|---|
| 10035 req/sec | 37834 req/sec |
ざっくりですが、3.7倍ほど速いっぽいです。
想像よりも大きな差でした…!パフォーマンスはHonoの方が気になりますね。
RegExpRouterがとにかく爆速なのだとか。
書き方はExpressと違う?
いくら速くて軽くても、学習コストが高すぎると辛い…。
ExpressとHonoの基本的な書き方を比較します!
(コード作成はGeminiに手伝ってもらいつつ)
文字表示
Express
import express from 'express';
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello Express!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
Hono
import { Hono } from 'hono';
import { serve } from '@hono/node-server'; // Node.js用のアダプタ
const app = new Hono();
app.get('/', (c) => {
// c = Contextオブジェクト
return c.text('Hello Hono!');
});
serve(app);
JSONのPOSTリクエスト
Express
import express from 'express';
const app = express();
// JSONをパースするミドルウェアが必要
app.use(express.json());
app.post('/api', (req, res) => {
const body = req.body;
res.json({ message: 'OK', data: body });
});
// (app.listenは省略)
Hono
import { Hono } from 'hono';
import { serve } from '@hono/node-server';
const app = new Hono();
app.post('/api', async (c) => {
const body = await c.req.json(); // reqから直接json()を呼ぶ
return c.json({ message: 'OK', data: body });
});
serve(app);
URLパラメータの取得
Express
// :id がURLパラメータ
app.get('/user/:id', (req, res) => {
// req.params からIDを取得
const userId = req.params.id;
res.json({
message: `User ID ${userId} の情報を取得しました`
});
});
Hono
// :id がURLパラメータ
app.get('/user/:id', (c) => {
// c.req.param() からIDを取得
const userId = c.req.param('id');
return c.json({
message: `User ID ${userId} の情報を取得しました`
});
});
比較したところ
そこまで大きな違いは見られませんでした。
Expressを使ったことがあればHonoも難なく使い始めることができる気がします!
Honoのために学習時間をかなり要する、ということはしなくてよさそうですね。
おわりに
ざっくりとした比較調査にはなってしまいましたが、
Expressを触ったことがある人ならば、Honoを使った開発を経験してみたい!と個人的には思いました。
今回の記事ではメリットを多く含んでおりますが、やはりデメリットもあるようで…
そこはこれからHonoを使ってみて試行錯誤していきます!!
Discussion