ストリーミング
ストリーミングを使用すると、ページ全体のコンテンツが準備できるのを待つのではなく、利用可能になったコンテンツをすぐに配信することで、ユーザーエクスペリエンスを向上させることができます。
ホスティングプロバイダーがストリーミングをサポートしていることを確認してください。すべてのプロバイダーがサポートしているわけではありません。レスポンスがストリーミングされていないように見える場合は、これが原因である可能性があります。
手順
データをストリーミングするには、3つの手順があります。
- プロジェクトのセットアップ: クライアントとサーバーのエントリーポイントがストリーミングをサポートするように設定されていることを確認する必要があります。
- コンポーネントのセットアップ: コンポーネントがストリーミングされたデータをレンダリングできることを確認する必要があります。
- ローダーデータの遅延: 最後に、ローダーでデータを遅延させることができます。
1. プロジェクトのセットアップ
最初から準備完了: スターターテンプレートを使用して作成されたRemixアプリは、ストリーミング用に事前設定されています。
手動セットアップが必要ですか?: プロジェクトがゼロから開始された場合、または古いテンプレートを使用した場合は、entry.server.tsx
とentry.client.tsx
にストリーミングサポートがあることを確認してください。これらのファイルが表示されない場合は、デフォルトを使用しており、ストリーミングがサポートされています。独自のエントリーを作成した場合は、参考のためにテンプレートのデフォルトを以下に示します。
2. コンポーネントのセットアップ
ストリーミングを使用しないルートモジュールは、次のようになります。
ストリーミングされたデータをレンダリングするには、Reactの<Suspense>
とRemixの<Await>
を使用する必要があります。少しボイラープレートですが、簡単です。
このコードは、データの遅延を開始する前でも引き続き機能します。最初にコンポーネントコードを作成することをお勧めします。問題が発生した場合は、問題の場所を特定するのが簡単になります。
3. ローダーでのデータの遅延
プロジェクトとルートコンポーネントがストリームデータを設定したので、ローダーでデータの遅延を開始できます。これを行うには、Remixのdefer
ユーティリティを使用します。
非同期プロミスコードの変更に注意してください。
レビュープロミスをawaitする代わりに、defer
に渡します。これにより、Remixは、そのプロミスをネットワーク経由でブラウザーにストリーミングするように指示します。
以上です!これで、ブラウザーにデータをストリーミングできるようになります。
非効率なストリーミングの回避
遅延データのプロミスは、他のプロミスをawaitする_前_に開始することが重要です。そうしないと、ストリーミングのメリットを十分に得ることができません。効率の低いコード例との違いに注意してください。
サーバータイムアウトの処理
ストリーミングにdefer
を使用する場合、entry.server.tsx
ファイルの<RemixServer abortDelay>
プロパティ(デフォルトは5秒)を介して、遅延データがタイムアウトする前に解決するまで待機する時間をRemixに指示できます。現在entry.server.tsx
ファイルがない場合は、npx remix reveal entry.server
を使用して公開できます。この値を使用して、setTimeout
を介してReactのrenderToPipeableStream
メソッドを中止することもできます。
コンテンツセキュリティポリシーを使用したストリーミング
ストリーミングは、遅延プロミスが解決されると、スクリプトタグをDOMに挿入することで機能します。ページにスクリプトのコンテンツセキュリティポリシーが含まれている場合は、Content-Security-Policy
ヘッダーにscript-src 'self' 'unsafe-inline'
を含めることでセキュリティポリシーを弱めるか、すべてのスクリプトタグにnonceを追加する必要があります。
nonceを使用している場合は、次の3つの場所に含める必要があります。
Content-Security-Policy
ヘッダー。例:Content-Security-Policy: script-src 'nonce-secretnoncevalue'
<Scripts />
、<ScrollRestoration />
、および<LiveReload />
コンポーネント。例:<Scripts nonce="secretnoncevalue" />
entry.server.ts
でrenderToPipeableStream
を呼び出す場所。例:
これにより、遅延スクリプトタグにnonce値が含まれるようになります。