本文へ移動

ルーター ​

ルーターは Hono の最も重要な機能です。

Hono には 5 種類のルーターがあります。

RegExpRouter ​

RegExpRouter は JavaScript で最速のルーターです。

名前に「RegExp」とありますが、Express のように path-to-regexp を使う実装ではありません。 そのような実装は線形ループを使い、すべてのルートに対して正規表現の照合を行うため、ルート数が増えるほど性能が低下します。

Hono の RegExpRouter は、ルートのパターンを「1 つの大きな正規表現」に変換し、1 回の照合で結果を得ます。

多くの場合、radix-tree などの木構造に基づくアルゴリズムより高速です。

ただし、RegExpRouter はすべてのルーティングパターンに対応しているわけではありません。そのため、通常は以下の全パターンに対応したルーターと組み合わせて使用します。

TrieRouter ​

TrieRouter は Trie 木アルゴリズムを使うルーターです。RegExpRouter と同様に、線形ループを使用しません。

RegExpRouter ほど高速ではありませんが、Express のルーターよりはるかに高速です。 TrieRouter はすべてのパターンに対応しています。

SmartRouter ​

SmartRouter は複数のルーターを使うときに便利です。登録されたルーターから最適なものを選びます。 Hono は標準で SmartRouter、RegExpRouter、TrieRouter を使用します。

ts
// Inside the core of Hono.
readonly defaultRouter: Router = new SmartRouter({
  routers: [new RegExpRouter(), new TrieRouter()],
})

アプリケーション起動時に、SmartRouter は登録されたルートに基づいて最速のルーターを選び、その後も使い続けます。

LinearRouter ​

RegExpRouter は高速ですが、ルート登録には少し時間がかかる場合があります。そのため、リクエストごとに初期化する環境には適していません。

LinearRouter は「一度きり」の実行に最適化されています。 文字列のコンパイルを行わず、線形の方式でルートを追加するため、RegExpRouter より大幅に高速にルートを登録できます。

次に、ルート登録フェーズも含めたベンチマーク結果の一例を示します。

console
• 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

PatternRouter ​

PatternRouter は Hono のルーターの中で最も小さいルーターです。

Hono はもともとコンパクトですが、リソースが限られた環境でさらに小さくしたい場合は PatternRouter を使用してください。

PatternRouter のみを使うアプリケーションは、15KB 未満になります。

console
$ npx wrangler deploy --minify ./src/index.ts
 ⛅️ wrangler 3.20.0
-------------------
Total Upload: 14.68 KiB / gzip: 5.38 KiB

MIT ライセンスで公開されています。