라우터
라우터는 Hono에서 가장 중요한 기능 중 하나다.
Hono는 총 5개의 라우터를 제공한다.
RegExpRouter
RegExpRouter는 자바스크립트 세계에서 가장 빠른 라우터다.
이름이 "RegExp"라고 해서 path-to-regexp를 사용해 Express와 유사하게 구현된 것은 아니다. 기존 방식은 선형 루프를 사용한다. 따라서 모든 라우트에 대해 정규 표현식 매칭이 수행되며, 라우트가 많아질수록 성능이 저하된다.

Hono의 RegExpRouter는 라우트 패턴을 "하나의 큰 정규 표현식"으로 변환한다. 그런 다음 한 번의 매칭으로 결과를 얻을 수 있다.

이 방식은 대부분의 경우 radix-tree와 같은 트리 기반 알고리즘을 사용하는 방법보다 빠르게 동작한다.
TrieRouter
TrieRouter는 Trie-tree 알고리즘을 사용하는 라우터다. RegExpRouter와 달리 선형 루프를 사용하지 않는다.

이 라우터는 RegExpRouter만큼 빠르지는 않지만, Express 라우터보다는 훨씬 빠르다. TrieRouter는 RegExpRouter가 지원하지 않는 모든 패턴을 지원한다.
SmartRouter
RegExpRouter는 모든 라우팅 패턴을 지원하지 않는다. 따라서 일반적으로 모든 패턴을 지원하는 다른 라우터와 함께 사용한다.
SmartRouter는 등록된 라우터를 기반으로 최적의 라우터를 선택한다. Hono는 기본적으로 SmartRouter와 두 가지 라우터를 사용한다:
// 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 FindMyWayFastly 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