ルーター
ルーターはHonoの最も重要な機能です。
Honoには5つのルーターがあります。
RegExpRouter
**RegExpRouter**はJavaScriptの世界で最速のルーターです。
これは「RegExp」と呼ばれていますが、path-to-regexpを使ったExpressのような実装ではありません。それらは線形ループを使用しています。そのため、すべてのルートに対して正規表現のマッチングが実行され、ルートが増えるほどパフォーマンスが低下します。
HonoのRegExpRouterは、ルートルートパターンを「1つの大きな正規表現」に変換します。そして、1回のマッチングで結果を得ることができます。
これは、ほとんどの場合、radix-treeなどのツリーベースのアルゴリズムを使用するメソッドよりも高速に動作します。
TrieRouter
**TrieRouter**はTrie木アルゴリズムを使用したルーターです。RegExpRouterと同様に線形ループを使用しません。
このルーターはRegExpRouterほど高速ではありませんが、Expressルーターよりもはるかに高速です。TrieRouterはRegExpRouterがサポートしていないすべてのパターンをサポートしています。
SmartRouter
RegExpRouterはすべてのルーティングパターンをサポートしているわけではありません。そのため、通常はすべてのパターンをサポートする別のルーターと組み合わせて使用されます。
**SmartRouter**は、登録されたルーターから推測して最適なルーターを選択します。 HonoはデフォルトでSmartRouterと2つのルーターを使用します
// Inside the core of Hono.
readonly defaultRouter: Router = new SmartRouter({
routers: [new RegExpRouter(), new TrieRouter()],
})
アプリケーションの起動時に、SmartRouterはルーティングに基づいて最速のルーターを検出し、それを使い続けます。
LinearRouter
RegExpRouterは高速ですが、ルート登録フェーズが少し遅くなる可能性があります。そのため、リクエストごとに初期化される環境には適していません。
**LinearRouter**は「ワンショット」の状況に最適化されています。文字列をコンパイルせずに線形アプローチを使用してルートを追加するため、ルート登録はRegExpRouterよりも大幅に高速です。
以下は、ルート登録フェーズを含むベンチマーク結果の1つです。
• GET /user/lookup/username/hey
----------------------------------------------------- -----------------------------
LinearRouter 1.82 µs/iter (1.7 µs … 2.04 µs) 1.84 µs 2.04 µs 2.04 µs
MedleyRouter 4.44 µs/iter (4.34 µs … 4.54 µs) 4.48 µs 4.54 µs 4.54 µs
FindMyWay 60.36 µs/iter (45.5 µs … 1.9 ms) 59.88 µs 78.13 µs 82.92 µs
KoaTreeRouter 3.81 µs/iter (3.73 µs … 3.87 µs) 3.84 µs 3.87 µs 3.87 µs
TrekRouter 5.84 µs/iter (5.75 µs … 6.04 µs) 5.86 µs 6.04 µs 6.04 µs
summary for GET /user/lookup/username/hey
LinearRouter
2.1x faster than KoaTreeRouter
2.45x faster than MedleyRouter
3.21x faster than TrekRouter
33.24x faster than FindMyWay
Fastly Computeのような状況では、 `hono/quick` プリセットでLinearRouterを使用することをお勧めします。
PatternRouter
**PatternRouter**は、Honoのルーターの中で最も小さいルーターです。
Honoはすでにコンパクトですが、リソースが限られている環境でさらに小さくする必要がある場合は、PatternRouterを使用できます。
PatternRouterのみを使用するアプリケーションのサイズは15KB未満です。
$ npx wrangler deploy --minify ./src/index.ts
⛅️ wrangler 3.20.0
-------------------
Total Upload: 14.68 KiB / gzip: 5.38 KiB