renderToString
renderToString
はReactツリーをHTML文字列にレンダリングします。
const html = renderToString(reactNode, options?)
リファレンス
renderToString(reactNode, options?)
サーバーでは、アプリをHTMLにレンダリングするためにrenderToString
を呼び出します。
import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);
クライアントでは、サーバー生成のHTMLをインタラクティブにするためにhydrateRoot
を呼び出します。
パラメーター
-
reactNode
: HTMLにレンダリングしたいReactノード。例えば、<App />
のようなJSXノード。 -
オプション
options
: サーバーレンダリングのためのオブジェクト。- オプション
identifierPrefix
:useId
によって生成されるIDにReactが使用する文字列プレフィックス。同じページで複数のルートを使用する場合に、競合を避けるのに役立ちます。hydrateRoot
に渡されたプレフィックスと同じである必要があります。
- オプション
戻り値
HTML文字列。
注意事項
-
renderToString
はSuspenseのサポートが限定的です。コンポーネントがサスペンドした場合、renderToString
はただちにフォールバックをHTMLとして送信します。 -
renderToString
はブラウザで動作しますが、クライアントコードで使用することは推奨されません。
使用方法
ReactツリーをHTML文字列としてレンダリングする
renderToString
を呼び出してアプリをHTML文字列にレンダリングし、サーバーレスポンスで送信します。
import { renderToString } from 'react-dom/server';
// The route handler syntax depends on your backend framework
app.use('/', (request, response) => {
const html = renderToString(<App />);
response.send(html);
});
これにより、Reactコンポーネントの初期の非インタラクティブなHTML出力が生成されます。クライアント側では、hydrateRoot
を呼び出して、サーバーで生成されたHTMLを*ハイドレート*し、インタラクティブにする必要があります。
代替案
renderToString
からのサーバーでのストリーミングレンダリングへの移行
renderToString
はすぐに文字列を返すため、ロード中のコンテンツのストリーミングをサポートしていません。
可能な限り、これらのフル機能の代替案を使用することをお勧めします。
- Node.jsを使用する場合は、
renderToPipeableStream
を使用します。 - DenoまたはWeb Streamsを使用する最新のEdgeランタイムを使用する場合は、
renderToReadableStream
を使用します。
サーバー環境がストリームをサポートしていない場合は、renderToString
を引き続き使用できます。
renderToString
からのサーバーでの静的プリレンダリングへの移行
renderToString
はすぐに文字列を返すため、静的HTML生成のためにデータのロードを待つことはできません。
これらのフル機能の代替案を使用することをお勧めします。
- Node.jsを使用する場合は、
prerenderToNodeStream
を使用します。 - DenoまたはWeb Streamsを使用する最新のEdgeランタイムを使用する場合は、
prerender
を使用します。
静的サイト生成環境がストリームをサポートしていない場合は、renderToString
を引き続き使用できます。
クライアントコードからrenderToString
を削除する
場合によっては、renderToString
はクライアント側でコンポーネントをHTMLに変換するために使用されます。
// 🚩 Unnecessary: using renderToString on the client
import { renderToString } from 'react-dom/server';
const html = renderToString(<MyIcon />);
console.log(html); // For example, "<svg>...</svg>"
クライアントでreact-dom/server
をインポートすると、バンドルサイズが不必要に増加するため、避けるべきです。ブラウザでコンポーネントをHTMLにレンダリングする必要がある場合は、createRoot
を使用し、DOMからHTMLを読み取ります。
import { createRoot } from 'react-dom/client';
import { flushSync } from 'react-dom';
const div = document.createElement('div');
const root = createRoot(div);
flushSync(() => {
root.render(<MyIcon />);
});
console.log(div.innerHTML); // For example, "<svg>...</svg>"
DOM の flushSync
呼び出しは、その innerHTML
プロパティを読み取る前に DOM を更新するために必要です。
トラブルシューティング
コンポーネントがサスペンドすると、HTML には常にフォールバック が含まれています。
renderToString
は Suspense を完全にサポートしていません。
コンポーネントがサスペンドする場合(たとえば、lazy
で定義されているか、データのフェッチを行う場合)、renderToString
はそのコンテンツの解決を待ちません。代わりに、renderToString
は、その上に最も近い <Suspense>
バウンダリを見つけ、その fallback
プロップを HTML にレンダリングします。コンテンツは、クライアントコードがロードされるまで表示されません。
これを解決するには、推奨されるストリーミングソリューションのいずれか を使用します。サーバーサイドレンダリングの場合、サーバー上で解決されるにつれてチャンク単位でコンテンツをストリーミングできるため、クライアントコードがロードされる前にページが段階的に表示されます。静的サイト生成の場合、すべてのコンテンツが解決されるまで待ってから静的 HTML を生成できます。