Skip to content

路由

路由是 Hono 最重要的特性。

Hono 有五种路由。

RegExpRouter

RegExpRouter 是 JavaScript 世界中最快的路由。

虽然它被称为 “RegExp”,但它不是像 Express 那样使用 path-to-regexp 的实现。 它们使用线性循环。 因此,将对所有路由执行正则表达式匹配,并且随着路由数量的增加,性能会下降。

Router Linear

Hono 的 RegExpRouter 将路由模式转换为“一个大型正则表达式”。 然后它可以通过一次匹配获得结果。

Router RegExp

在大多数情况下,这比使用基于树的算法(如 radix-tree)的方法更快。

TrieRouter

TrieRouter 是使用 Trie 树算法的路由。 它不像 RegExpRouter 那样使用线性循环。

Router Tree

这个路由不如 RegExpRouter 快,但比 Express 路由快得多。 TrieRouter 支持所有模式,而 RegExpRouter 不支持。

SmartRouter

RegExpRouter 不支持所有路由模式。 因此,它通常与另一个支持所有模式的路由结合使用。

SmartRouter 将通过从注册的路由推断来选择最佳路由。 Hono 默认使用 SmartRouter 和以下两个路由:

ts
// 在 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

GET /user/lookup/username/hey 的摘要
  LinearRouter
   比 KoaTreeRouter 快 2.1 倍
   比 MedleyRouter 快 2.45 倍
   比 TrekRouter 快 3.21 倍
   比 FindMyWay 快 33.24 倍

对于像 Fastly Compute 这样的情况,最好将 LinearRouter 与 hono/quick 预设一起使用。

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 许可证下发布。