跳转到正文

路由器 ​

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

Hono 提供五种路由器。

RegExpRouter ​

RegExpRouter 是 JavaScript 领域最快的路由器。

虽然名字中有“RegExp”,但它并不是像 Express 那样基于 path-to-regexp 实现的。 这类实现使用线性循环,对所有路由逐一执行正则表达式匹配,因此路由数量越多,性能就越差。

Hono 的 RegExpRouter 会把路由模式转换为“一个大型正则表达式”,然后通过一次匹配得到结果。

在大多数情况下,这种方法比 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 许可证发布。