0Pricing
React Academy · レッスン

Honoを使ったCloudflare Workers上のReact

HonoとrenderToReadableStreamを使ってCloudflare Workerを設定し、エッジからReactページを配信します。

「Honoを使ったCloudflare Workers上のReact」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

Hono とは

Hono は、Cloudflare Workers、Deno Deploy、Bun、Node.js などのエッジランタイムで動作するように設計された、軽量で非常に高速な Web フレームワークです。API は Express に着想を得ていますが、Web 標準(Fetch API、Request/Response)を基盤として一から構築されているため、エッジ環境に自然に適合します。

Hono で Cloudflare Worker を作成する

Cloudflare Workers 用の新しい Hono プロジェクトのスキャフォールディングは簡単です。npm create hono@latest を実行するとテンプレートの選択が求められるので、"cloudflare-workers" を選択します。wrangler(Cloudflare の CLI)と Hono の依存関係があらかじめ設定されたプロジェクトが作成されます。

React SSR の追加

Hono Worker 内で React をサーバーレンダリングするには、react、react-dom、@types/react をインストールし、react-dom/server から renderToReadableStream をインポートします。この関数は React 18 のストリーミング API の一部で、Cloudflare Workers がサポートする Web Streams API に対応するよう設計されています。

Hono のルートハンドラー

一般的な SSR のルートハンドラーでは、ルート React コンポーネントを指定して renderToReadableStream を呼び出し、ストリームを await してから、c.body(stream, { headers: { 'Content-Type': 'text/html' } }) または c.html(htmlString) を使ってレスポンスを送信します。ストリームは HTML のチャンクを生成し、ブラウザーはそれを段階的にレンダリングできます。

renderToReadableStream の戻り値の型

renderToReadableStream は、HTML のチャンクを含む ReadableStream に解決される Promise を返します。この ReadableStream は Web Streams API に準拠しており、Response オブジェクトの body として直接渡せるため、Cloudflare Workers の fetch ハンドラーに適しています。

HTML シェルでラップする

React のストリームが生成するのはコンポーネントツリーの HTML であり、周囲のドキュメントは含まれません。そのため、ストリームを HTML シェルに挿入する必要があります。HTML シェルは、doctype、meta タグと CSS link を含む head、開始 body タグ、React のストリーム、そして終了 body タグと html タグを含む文字列です。

静的アセットの配信

Vite でビルドした React クライアントバンドルは、Worker と一緒に配信する必要があります。Cloudflare Pages または Workers Assets 機能を利用できます。c.env.ASSETS.fetch(request) によってアセットのリクエスト(JS、CSS、画像)がルーティングされ、Worker のデプロイ時にアップロードされた静的ファイルが返されます。

worker.js のエントリーポイント

Worker のエントリーファイルは、fetch ハンドラーを持つデフォルトオブジェクトをエクスポートします。export default { fetch: app.fetch } のように記述します。Hono の app.fetch メソッドは、Request を受け取って Response を返す互換性のある fetch ハンドラーなので、Workers ランタイムに直接接続できます。

Wrangler によるローカル開発

wrangler dev は、Cloudflare Workers ランタイムをマシン上でエミュレートするローカル開発サーバーを起動します。ファイルの変更を監視して自動的に再読み込みするため、本番環境にデプロイする前に高速なローカル開発ループを実現できます。

Cloudflare へのデプロイ

wrangler deploy は Worker のコードをバンドルして Cloudflare のネットワークにアップロードし、数秒以内に 300 か所以上のすべてのエッジロケーションで利用できるようにします。wrangler.toml 設定ファイルでは、アカウント ID、Worker 名、KV namespace や D1 database のバインディングを指定します。

bootstrapScripts によるハイドレーション

クライアント側のインタラクティブ性を有効にするには、renderToReadableStream に bootstrapScripts: ['/assets/client.js'] を渡します。React は、クライアントバンドルを読み込んでサーバーレンダリング済みの DOM に対して hydrateRoot を呼び出す script タグを HTML に挿入します。これにより、JS の読み込み後にページがインタラクティブになります。

renderToReadableStream の戻り値の型

renderToReadableStream は何を返しますか?

レッスンのまとめ

Hono は、React の renderToReadableStream ときれいに統合できる、軽量でエッジネイティブな HTTP フレームワークです。Worker のエントリーポイントは app.fetch を Workers ランタイムに直接エクスポートし、静的アセットは ASSETS バインディング経由で配信します。wrangler はローカル開発と本番デプロイの両方を処理します。bootstrapScripts によって、ストリーミングされた HTML とクライアント側のハイドレーションバンドルが接続されます。

よくある質問

「Honoを使ったCloudflare Workers上のReact」レッスンは無料ですか?

はい。「Honoを使ったCloudflare Workers上のReact」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Honoを使ったCloudflare Workers上のReact」で何を学びますか?

HonoとrenderToReadableStreamを使ってCloudflare Workerを設定し、エッジからReactページを配信します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Honoを使ったCloudflare Workers上のReact」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エッジレンダリングとは何か、なぜ重要なのか
  2. Honoを使ったCloudflare Workers上のReact
  3. エッジからのストリーミングSSR
  4. Reactアプリのエッジキャッシュ戦略
← React Academyに戻る