サーバーサイドレンダリング、サーバーサイド生成
サーバーサイドレンダリングはReact Flow 12以降でサポートされています
これは高度なユースケースであり、React Flowをすでに使い慣れていることを前提としています。React Flowを初めて使用する場合は、はじめにガイドを確認してください。
このガイドでは、サーバー上でフローをレンダリングするようにReact Flowを設定する方法を学びます。これにより、以下のことが可能になります。
- ドキュメントに静的なHTML図を表示する
- 非JS環境でReact Flow図をレンダリングする
- フローへのリンクを共有するときに埋め込みとして表示されるopengraph画像を動的に生成する
(フローの画像をダウンロードしたい場合は、クライアント側でより簡単な方法があります。ダウンロード画像例をご覧ください。)
ノードの寸法
React Flowをサーバー上で動作させるには、いくつかの設定が必要です。最も重要なのはノードの寸法です。React Flowは、幅と高さがある場合にのみノードをレンダリングします。通常、特定のwidth
およびheight
を指定せずにノードを渡すと、それらが測定され、寸法がmeasured.width
およびmeasured.height
に書き込まれます。サーバー上で寸法を測定できないため、明示的に渡す必要があります。これは、width
とheight
、またはinitialWidth
とinitialHeight
のノードプロパティを使用して行うことができます。
const nodes = [
{
id: '1',
type: 'default',
position: { x: 0, y: 0 },
data: { label: 'Node 1' },
width: 100,
height: 50,
},
];
React Flowはノードの寸法を認識し、サーバー上でレンダリングできます。width
とheight
プロパティは、ノードのインラインスタイルとして使用されます。クライアント上でノードの寸法が異なる場合や、寸法がコンテンツに基づいて動的である必要がある場合は、initialWidth
とinitialHeight
プロパティを使用できます。これらは、ノードが測定されず、measured.width
とmeasured.height
が設定されていない限り、(サーバー上またはクライアント上で)最初のレンダリングでのみ使用されます。
サーバーサイドレンダリング用にノードの寸法を指定する方法は2つあります。
width
およびheight
:事前にわかっており、変更されない静的な寸法の場合。
initialWidth
およびinitialHeight
:事前にわかっていないか、変更される動的な寸法の場合。
ハンドルの位置
サーバー上でエッジもレンダリングしたい場合もあるでしょう。クライアントでは、React Flowはハンドルの位置をチェックし、エッジを描画するための情報を保存します。サーバー上でハンドルの位置を測定できないため、この情報も渡す必要があります。これは、ノードのhandles
プロパティを使用して行うことができます。
const nodes: Node[] = [
{
id: '1',
type: 'default',
position: { x: 0, y: 0 },
data: { label: 'Node 1' },
width: 100,
height: 50,
handles: [
{
type: 'target',
position: Position.Top,
x: 100 / 2,
y: 0,
},
{
type: 'source',
position: Position.Bottom,
x: 100 / 2,
y: 50,
},
],
},
];
この追加情報により、React Flowはサーバー上でエッジをレンダリングするのに十分な情報を把握できます。ノードのみをレンダリングするだけでよい場合は、この手順をスキップできます。
サーバーでのfitView
の使用
React Flowコンテナ自体の寸法がわかっている場合は、サーバー上でfitView
を使用することもできます。このためには、コンテナのwidth
とheight
をReactFlow
コンポーネントに渡す必要があります。
<ReactFlow nodes={nodes} edges={edges} fitView width={1000} height={500} />
これにより、ビューポートが計算され、すべてのノードをビューポートに含めるために、サーバー上でtransform
が設定されます。
<ReactFlowProvider>
との使用
ReactFlowProvider
を使用している場合は、initialNodes
、initialEdges
、オプションのラッパー寸法(initialWidth
およびinitialHeight
)、およびfitView
をプロバイダーに渡すことができます。
<ReactFlowProvider
initialNodes={nodes}
initialEdges={edges}
initialWidth={1000}
initialHeight={500}
fitView
>
<App />
</ReactFlowProvider>