学ぶ高度な使用法

サーバーサイドレンダリング、サーバーサイド生成

サーバーサイドレンダリングはReact Flow 12以降でサポートされています

これは高度なユースケースであり、React Flowをすでに使い慣れていることを前提としています。React Flowを初めて使用する場合は、はじめにガイドを確認してください。

このガイドでは、サーバー上でフローをレンダリングするようにReact Flowを設定する方法を学びます。これにより、以下のことが可能になります。

  • ドキュメントに静的なHTML図を表示する
  • 非JS環境でReact Flow図をレンダリングする
  • フローへのリンクを共有するときに埋め込みとして表示されるopengraph画像を動的に生成する

(フローの画像をダウンロードしたい場合は、クライアント側でより簡単な方法があります。ダウンロード画像例をご覧ください。)

ノードの寸法

React Flowをサーバー上で動作させるには、いくつかの設定が必要です。最も重要なのはノードの寸法です。React Flowは、幅と高さがある場合にのみノードをレンダリングします。通常、特定のwidthおよびheightを指定せずにノードを渡すと、それらが測定され、寸法がmeasured.widthおよびmeasured.heightに書き込まれます。サーバー上で寸法を測定できないため、明示的に渡す必要があります。これは、widthheight、またはinitialWidthinitialHeightのノードプロパティを使用して行うことができます。

const nodes = [
  {
    id: '1',
    type: 'default',
    position: { x: 0, y: 0 },
    data: { label: 'Node 1' },
    width: 100,
    height: 50,
  },
];

React Flowはノードの寸法を認識し、サーバー上でレンダリングできます。widthheightプロパティは、ノードのインラインスタイルとして使用されます。クライアント上でノードの寸法が異なる場合や、寸法がコンテンツに基づいて動的である必要がある場合は、initialWidthinitialHeightプロパティを使用できます。これらは、ノードが測定されず、measured.widthmeasured.heightが設定されていない限り、(サーバー上またはクライアント上で)最初のレンダリングでのみ使用されます。

💡

サーバーサイドレンダリング用にノードの寸法を指定する方法は2つあります。

  1. widthおよびheight:事前にわかっており、変更されない静的な寸法の場合。
  1. 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を使用することもできます。このためには、コンテナのwidthheightReactFlowコンポーネントに渡す必要があります。

<ReactFlow nodes={nodes} edges={edges} fitView width={1000} height={500} />

これにより、ビューポートが計算され、すべてのノードをビューポートに含めるために、サーバー上でtransformが設定されます。

<ReactFlowProvider>との使用

ReactFlowProviderを使用している場合は、initialNodesinitialEdges、オプションのラッパー寸法(initialWidthおよびinitialHeight)、およびfitViewをプロバイダーに渡すことができます。

<ReactFlowProvider
  initialNodes={nodes}
  initialEdges={edges}
  initialWidth={1000}
  initialHeight={500}
  fitView
>
  <App />
</ReactFlowProvider>