路由器
路由器是 Hono 最重要的功能之一。
Hono 有五个路由器。
RegExpRouter
RegExpRouter 是 JavaScript 世界中最快的路由器。
虽然它被称为“RegExp”,但它不是使用 path-to-regexp 的类似 Express 的实现。它们使用线性循环。因此,当您有更多路由时,将对所有路由执行正则表达式匹配,性能将下降。
Hono 的 RegExpRouter 将路由模式转换为“一个大型正则表达式”。然后它可以一次匹配获得结果。
在大多数情况下,这比使用基于树的算法(例如基数树)的方法更快。
TrieRouter
TrieRouter 是使用 Trie 树算法的路由器。它不像 RegExpRouter 那样使用线性循环。
这个路由器没有 RegExpRouter 那么快,但它比 Express 路由器快得多。TrieRouter 支持所有模式,而 RegExpRouter 不支持。
SmartRouter
RegExpRouter 不支持所有路由模式。因此,它通常与另一个支持所有模式的路由器结合使用。
SmartRouter 将根据注册的路由器推断出最佳路由器。Hono 默认使用 SmartRouter 和这两个路由器。
// Inside the core of Hono.
readonly defaultRouter: Router = new SmartRouter({
routers: [new RegExpRouter(), new TrieRouter()],
})
当应用程序启动时,SmartRouter 会根据路由检测最快的路由器并继续使用它。
LinearRouter
RegExpRouter 很快,但路由注册阶段可能稍微慢一些。因此,它不适合每次请求都初始化的环境。
LinearRouter 针对“一次性”情况进行了优化。路由注册比 RegExpRouter 快得多,因为它使用线性方法添加路由,而无需编译字符串。
以下是包括路由注册阶段的基准测试结果之一。
• 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