跳到内容

路由器

路由器是 Hono 最重要的功能之一。

Hono 有五个路由器。

RegExpRouter

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

虽然它被称为“RegExp”,但它不是使用 path-to-regexp 的类似 Express 的实现。它们使用线性循环。因此,当您有更多路由时,将对所有路由执行正则表达式匹配,性能将下降。

Router Linear

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

Router RegExp

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

TrieRouter

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

Router Tree

这个路由器没有 RegExpRouter 那么快,但它比 Express 路由器快得多。TrieRouter 支持所有模式,而 RegExpRouter 不支持。

SmartRouter

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

SmartRouter 将根据注册的路由器推断出最佳路由器。Hono 默认使用 SmartRouter 和这两个路由器。

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

对于 Fastly Compute 之类的场景,最好使用 hono/quick 预设的 LinearRouter。

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