Motivation
ChatGPT3.5くんのまとめ
要点を箇条書きでまとめると以下の通りです:
- 最初は、Cloudflare Workers上でウェブアプリケーションを作成したかった。
- Cloudflare Workersで動作する良いフレームワークがなかったため、Honoの開発を開始し、Trie木を使用したルーターの構築方法を学ぶ良い機会と考えた。
- 友人が超高速なルーター「RegExpRouter」を持ち込んできた。また、Basic認証ミドルウェアを作成した友人もいた。
- Web標準APIのみを使用することで、DenoやBunで動作可能になった。ExpressがBunで動作するようになったが、「Bun用のExpressはない?」と問われた際に、「いいえ、しかしHonoがある」と答えることができる。
- GraphQLサーバー、Firebase認証、Sentryミドルウェアを提供する友人もいる。また、Node.jsアダプターもある。
- 言い換えれば、Honoは非常に高速であり、多くのことが可能であり、どこでも動作する。HonoがWeb標準のスタンダードになる可能性がある。
Routers
ChatGPT3.5くんのまとめ
RegExpRouter
- RegExpRouterはJavaScriptの中で最速のルーター。
- Expressのような実装ではなく、線形ループを使用している。
- 全てのルートに対して正規表現のマッチングが行われ、ルートが増えるとパフォーマンスが低下。
- HonoのRegExpRouterはルートパターンを1つの大きな正規表現に変換し、1回のマッチングで結果を得る。
- ほとんどの場合、radix-treeなどのツリーベースのアルゴリズムよりも高速。
TrieRouter
- TrieRouterはTrie木アルゴリズムを使用するルーターである。
- RegExpRouterと同様に、線形ループを使用しない。
- このルーターはRegExpRouterほど速くはないが、Expressルーターよりもはるかに速い。
- RegExpRouterがサポートしていないすべてのパターンをTrieRouterはサポートしている。
SmartRouter
- RegExpRouterはすべてのルーティングパターンをサポートしていない。そのため、通常はすべてのパターンをサポートする別のルーターと組み合わせて使用される。
- SmartRouterは、登録されたルーターから推論して最適なルーターを選択する。HonoはSmartRouterとデフォルトで2つのルーターを使用する。
- アプリケーションが開始されると、SmartRouterはルーティングに基づいて最速のルーターを検出し、それを継続して使用する。
LinearRouter
- RegExpRouterは高速だが、ルート登録の段階が若干遅い場合がある。したがって、リクエストごとに初期化される環境には適していない。
- LinearRouterは「ワンショット」の状況に最適化されている。ルート登録はRegExpRouterよりもかなり高速であり、文字列のコンパイルを行わずにルートを追加するため、線形的なアプローチを取っている。
- ベンチマークの結果では、ルート登録の段階も含まれている。
- Fastly Computeのような状況では、hono/quickプリセットを使用してLinearRouterを使用する方が良い。
PatternRouter
- PatternRouterは、Honoのルーターの中で最も小さい。
- Honoはすでにコンパクトだが、リソースが限られた環境向けにさらに小さくする必要がある場合は、PatternRouterを使用できる。
- PatternRouterのみを使用するアプリケーションは、サイズが15KB未満である。
Benchmarks
ChatGPT3.5くんのまとめ
- ベンチマークはただのベンチマークですが、我々にとっては重要です。
- ルーターの速度を測定しました。例えば、find-my-wayはFastify内で使用される非常に高速なルーターです。
- 実際の世界で使用されるルーティングに類似したルーティングを各ルーターに登録しました。
- 次に、リクエストをエンドポイントに送信しました。
- Node.js上の結果と、Bun上の結果、Cloudflare Workers上の結果が示されています。
- HonoはCloudflare Workersで最速であり、Denoでも最速であることが示されています。
- Bunでは、Honoが最速のフレームワークの1つであることが示されています。
Web Standard
ChatGPT3.5くんのまとめ
- HonoはFetchなどのWeb標準APIのみを使用します。これらはもともとfetch関数で使用され、HTTPリクエストとレスポンスを処理する基本的なオブジェクトから成り立っています。RequestsやResponsesのほか、URL、URLSearchParams、Headersなどが含まれます。
- Cloudflare Workers、Deno、Bunもまた、Web標準APIをベースに構築されています。例えば、"Hello World"を返すサーバーは以下のように書くことができます。これはCloudflare WorkersやBunで実行可能です。
- HonoはWeb標準APIのみを使用しており、これはHonoがそれらをサポートする任意のランタイム上で実行可能であることを意味します。また、Node.jsのアダプターもあります。
- HonoはCloudflare Workers、Deno、Bun、Fastly Compute、AWS Lambda、Node.js、Vercelなどのランタイムで動作します。Netlifyや他のプラットフォームでも動作します。同じコードがすべてのプラットフォームで実行されます。
- Cloudflare Workers、Deno、Shopifyなどは、Web標準APIを使用して「Web間の相互運用性」を実現する可能性について議論するためにWinterCGを立ち上げました。Honoは彼らの取り組みに続き、Web標準の標準化を目指します。
Middleware
ChatGPT3.5くんのまとめ
- 「Middleware(ミドルウェア)」は、Responseを返すプリミティブを「Handler(ハンドラー)」と呼びます。ミドルウェアはHandlerの前後で実行され、RequestとResponseを処理します。これはまるで玉ねぎのような構造です。
- 例えば、「X-Response-Time」ヘッダーを追加するミドルウェアを次のように書くことができます。
- このシンプルな方法で、独自のカスタムミドルウェアを書くことができ、組み込みのミドルウェアやサードパーティーのミドルウェアを使用することができます。
Developer Experience
ChatGPT3.5くんのまとめ
- 開発者体験は、優れたアプリケーションを作成するために重要です。
- 幸いなことに、Cloudflare Workers、Deno、およびBun向けのアプリケーションは、JavaScriptにトランスパイルする必要なくTypeScriptで記述できます。
- HonoはTypeScriptで書かれており、アプリケーションをタイプセーフにすることができます。
Hono Stacks
ChatGPT3.5くんのまとめ
- Hono Stacksは、簡単なことを簡単に、難しいことも簡単に行えます。JSONを返すだけでなく、REST APIサーバーやクライアントを含むフルスタックアプリケーションの構築にも適しています。
- HonoのRPC機能を使用すると、API仕様をほとんど変更せずにコードを共有できます。hcによって生成されたクライアントは仕様を読み取り、エンドポイントの型安全性を確保します。
- Hono、Zod、Zod Validator Middleware、hcのライブラリがこれを実現します。
- ミドルウェアやZodを使用して、エンドポイントのパスやリクエストのタイプを提案することができます。
- API仕様の共有により、サーバーサイドの変更に気づくことができます。
- Reactを使用してCloudflare Pagesでアプリケーションを作成できます。 APIサーバーは、Cloudflare PagesでReactを使用して作成できます。
- ReactとReact Queryを使用したクライアントも可能です。これにより、APIサーバーとの通信が簡単になります。