Hono概要とエッジランタイム
Web開発のフレームワークの世界で、最近注目を集めているHono(炎)について学んでいきましょう。「なんでまた新しいフレームワークが…?」と思われるかもしれませんが、Honoにはエッジランタイム時代にぴったりな特徴があります。
Honoとは何か?
HonoはTypeScriptで書かれた、モダンで軽量なWebフレームワークです。
Features
- Ultrafast 🚀 - The router
RegExpRouteris really fast. Not using linear loops. Fast.- Lightweight 🪶 - The
hono/tinypreset is under 14kB. Hono has zero dependencies and uses only the Web Standards.- Multi-runtime 🌍 - Works on Cloudflare Workers, Fastly Compute, Deno, Bun, AWS Lambda, or Node.js. The same code runs on all platforms.
- Batteries Included 🔋 - Hono has built-in middleware, custom middleware, third-party middleware, and helpers. Batteries included.
- Delightful DX 😃 - Super clean APIs. First-class TypeScript support. Now, we’ve got “Types”.
Honoの特徴
- 爆速 🚀 -
RegExpRouter速い。逐次処理を用いない。まじ速い。 - 軽量 🪶 -
hono/tinyプリセットはわずか 14kB 未満。依存関係ゼロでWeb標準のみ。 - マルチランタイム 🌍 - Cloudflare Workers、Fastly Compute、Deno、Bun、AWS Lambda、Node.js。どこのプラットフォームでも同じコードが動く。
- バッテリー同梱 🔋 - 内蔵のミドルウェア、カスタムミドルウェア、サードパーティのミドルウェア、ヘルパー。いわゆる バッテリー同梱。
- 楽しい開発体験 😃 - 超クリーンAPI。TypeScriptが第一級対応。すぐ“型“付く。
(筆者拙訳)
エッジランタイムとは?
従来のサーバー構成の課題
従来、Webアプリケーションは典型的には以下のような構成でした:
- 通信速度の地理的限界: ユーザーからサーバーまでの距離が遠いと遅延増加。光の速度を超えることは不可能に
- スケールの限界: サーバーへのトラフィック増加が加速するとサーバー負荷が増大。リソース不足や応答遅延に
- グローバル展開の困難さ: 世界中のユーザーに均一な体験を提供するのが難しい。サーバーのデプロイが開発者の負担に
Note
光速を超える通信のためのプロトコル2024年のエイプリルフールに RFC 9564 として公開されました。 このプロトコルは光速を超える通信を可能にするものですが、現実的な実装はまだ存在しません 😃
エッジコンピューティングとエッジランタイム
エッジコンピューティングとは、それらの課題を解決するために、ユーザーに物理的に近い場所 (エッジ) でアプリケーションを実行する考え方です。
従来のアーキテクチャ:
ユーザー (東京) → (インターネット) → サーバー (米国) → (インターネット) → レスポンス (東京)
エッジコンピューティングアーキテクチャ:
ユーザー(東京) → Edge(東京) → レスポンス
そして、「エッジランタイム」とはエッジコンピューティング環境でのアプリケーションの実行をする言語やランタイムのことを指します。
エッジランタイムの利点
- 低遅延
- ユーザーに近い場所で処理を実行
- 体感速度の大幅な向上
- 従量課金
- 使用した分だけ支払うモデル
- コスト効率の良い運用が可能
- グローバルな自動スケーリング
- トラフィックに応じて自動でリソースを調整
- 高可用性と耐障害性の向上
Honoがエッジランタイムで輝く理由
1. マルチランタイム対応
Honoは様々なランタイムで動作します。
- Cloudflare Workers:
- Fastly Compute
- Deno
- Bun
- AWS Lambda
- Node.js
どこのプラットフォームでも同じコードが動くため、開発者は一つのコードベースで開発できます。
2. 軽量設計
import { Hono } from "hono";
const app = new Hono();
app.get("/", (c) => c.text("Hello Hono!"));
export default app;
このシンプルなコードでWebサーバーが完成。バンドルサイズは驚くほど小さく、エッジランタイムでの起動時間を最小限に抑えます。
3. 型安全な開発体験
import { Hono } from "hono";
const app = new Hono();
app.get("/api/users/:id", (c) => {
const id = c.req.param("id"); // 型安全にパラメータを取得
return c.json({ id, name: "John Doe" });
});
TypeScriptとの親和性が高く、開発時のミスを防げます。
実際のエッジランタイムでの活用例
API Gateway
const app = new Hono();
// 認証ミドルウェア
app.use("/api/*", async (c, next) => {
const token = c.req.header("Authorization");
// トークン検証ロジック
await next();
});
// リクエストの振り分け
app.get("/api/users/*", (c) => {
// ユーザー関連のAPIへプロキシ
});
app.get("/api/products/*", (c) => {
// 商品関連のAPIへプロキシ
});
認証やルーティングを処理するAPI GatewayとしてHonoを活用。
静的サイトへの動的な機能
import { Hono } from 'hono'
import { serveStatic } from 'hono/cloudflare-workers'
const app = new Hono()
// 静的ファイルの配信
app.use('/*', serveStatic({ root: './dist' }))
// 動的なAPIエンドポイント
app.get('/api/search', async (c) => {
const query = c.req.query('q')
// 検索処理
return c.json({ results: [...] })
})
ポイント
- Hono:モダンで軽量なWebフレームワーク
- エッジコンピューティング:ユーザーに近い場所でアプリケーションを実行する考え方
- エッジランタイム:エッジコンピューティング環境でのアプリケーションを実行する言語やランタイム
- Honoの利点:マルチランタイム対応、軽量設計、型安全な開発体験