Skip to content

路由器

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

Hono 内建五种路由器。

RegExpRouter

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

虽然名字叫 “RegExp”,但它并不是 path-to-regexp 那样的 Express 风格实现。 后者使用线性循环,意味着每条路由都会逐一进行正则匹配, 路由越多性能越差。

Hono 的 RegExpRouter 会将路由模式转换成“一条巨大的正则表达式”, 只需一次匹配即可得到结果。

在多数场景下,这比使用诸如 radix-tree 等树形算法的方法更快。

不过,RegExpRouter 并不支持所有路由模式, 因此通常会与下文中支持全量路由模式的其他路由器搭配使用。

TrieRouter

TrieRouter 基于 Trie 树算法实现。 与 RegExpRouter 一样,它也不依赖线性循环。

它虽然没有 RegExpRouter 那么快,但仍比 Express 的路由器快得多, 并且支持全部路由模式。

SmartRouter

当你需要组合多种路由器时,SmartRouter 非常实用。 它会根据已注册的路由自动挑选最合适的路由器。 Hono 默认同时使用 SmartRouter、RegExpRouter 与 TrieRouter:

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

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

Released under the MIT License.