{"componentChunkName":"component---src-templates-info-posts-js","path":"/information/AI/03ff0628-d7a6-5312-9734-e7dc7810758d","result":{"data":{"microcmsInformation":{"id":"03ff0628-d7a6-5312-9734-e7dc7810758d","title":"React Flow（@xyflow/react）入門：v12以降の公式パッケージで作るノードUI","date":"2026 年 05 月 16 日","image":{"url":"https://images.microcms-assets.io/assets/52137c02cafa4450bbdc092b64fbadac/1056a0e9eb404e61be304588e80c28d7/ReactFlow_top.png"},"author":{"author":"Goubara"},"body":"<p>React Flow は、React 上でノードとエッジから成るインタラクティブなグラフ UI（ワークフローエディタ、ダイアグラム、低コードツールの編集画面など）を構築するためのオープンソースライブラリです。<strong>v12 の安定版は 2024 年 7 月にリリースされ、これに伴って npm パッケージ名が </strong><code>reactflow</code> から <code>@xyflow/react</code> へ変更されました。開発元の xyflow は、React 版（<code>@xyflow/react</code>）と Svelte 版（<code>@xyflow/svelte</code>）を同じブランドのもとで並行して提供しています。本記事では概要、仕組み、導入手順、注意点、関連技術を短時間で把握できるよう整理します。</p><h2 style=\"text-align: start\" id=\"h6dfabe39dd\">React Flow とは何か / 何ができるか</h2><p style=\"text-align: start\">React Flow は「ノードベース UI」を作るためのコンポーネントライブラリです。ドラッグ＆ドロップ、ズーム/パン、複数選択、ミニマップ、コントロール、背景グリッドといった基本機能を備えており、加えて <code>&lt;NodeResizer /&gt;</code> や <code>&lt;NodeToolbar /&gt;</code> などのリサイズ・ツールバー用コンポーネントも標準で提供されています。カスタムノードやカスタムエッジを自由に定義でき、ワークフロー／オートメーション、ETL やデータパイプライン、機械学習や LLM のフロー設計、チャットボットビルダー、ER 図・組織図などの可視化に広く使われています。</p><h2 style=\"text-align: start\" id=\"hf3a65b1004\">仕組みとアーキテクチャの要点</h2><p style=\"text-align: start\">内部はモノレポ構成になっており、<code>@xyflow/system</code>（フレームワーク非依存の共通ロジック）を土台に、<code>@xyflow/react</code> と <code>@xyflow/svelte</code> が実装されています。ビューポートの操作には d3-zoom を利用し、変更があったノードのみを再レンダリングする設計のため、規模が大きくなっても比較的軽快に動きます。</p><p style=\"text-align: start\">v12 の大きな変更点として、ノードに <code>width</code> / <code>height</code> / <code>handles</code> を事前指定できるようになり、<strong>これによってサーバー側で計測できない情報を明示的に渡せるようになったため、SSR/SSG にも対応できるようになりました</strong>。状態管理は内部のストアで行われ、<code>useReactFlow</code> などのフックを通じて参照できます。v11 までの <code>nodeInternals</code> マップは v12 で再設計され、ノードの実体は <code>nodes</code> 配列に、参照用途は新設の <code>nodeLookup</code> マップに分離されました（<code>nodeLookup</code> は変更のたびに新しいオブジェクトを生成しないため、ルックアップに適した設計です）。</p><h2 style=\"text-align: start\" id=\"h33290fac82\">導入手順と最小コード</h2><p style=\"text-align: start\">インストールは公式の Quick Start に従い、パッケージとスタイルを読み込みます。</p><pre><code>npm install @xyflow/react</code></pre><p style=\"text-align: start\">最小構成のコード例は次のとおりです。<strong>v12 から </strong><code>ReactFlow</code> は名前付きエクスポートになっている点、CSS の読み込みが必須である点に注意してください。</p><pre><code>import { useCallback } from &apos;react&apos;;\nimport {\n  ReactFlow,\n  Background,\n  Controls,\n  MiniMap,\n  useNodesState,\n  useEdgesState,\n  addEdge,\n} from &apos;@xyflow/react&apos;;\nimport &apos;@xyflow/react/dist/style.css&apos;;\n\nconst initialNodes = [\n  { id: &apos;1&apos;, position: { x: 0, y: 0 }, data: { label: &apos;Start&apos; } },\n  { id: &apos;2&apos;, position: { x: 200, y: 80 }, data: { label: &apos;Next&apos; } },\n];\nconst initialEdges = [{ id: &apos;e1-2&apos;, source: &apos;1&apos;, target: &apos;2&apos; }];\n\nexport default function Flow() {\n  const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n  const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n  const onConnect = useCallback(\n    (params) =&gt; setEdges((eds) =&gt; addEdge(params, eds)),\n    [],\n  );\n\n  return (\n    &lt;div style={{ width: &apos;100%&apos;, height: 480 }}&gt;\n      &lt;ReactFlow\n        nodes={nodes}\n        edges={edges}\n        onNodesChange={onNodesChange}\n        onEdgesChange={onEdgesChange}\n        onConnect={onConnect}\n        fitView\n      &gt;\n        &lt;Background /&gt;\n        &lt;Controls /&gt;\n        &lt;MiniMap /&gt;\n      &lt;/ReactFlow&gt;\n    &lt;/div&gt;\n  );\n}</code></pre><p style=\"text-align: start\">実行してアクセスすると、以下のような画面が表示されます。</p><figure><img src=\"https://images.microcms-assets.io/assets/52137c02cafa4450bbdc092b64fbadac/041f075a25c4400192806e9b2a15c5a5/ReactFlow.png\" alt=\"\" width=\"1280\" height=\"719\"></figure><p style=\"text-align: start\"><br><br>公式が提供する <code>useNodesState</code> / <code>useEdgesState</code> フックを使うと、状態と変更ハンドラを一括で取得でき、<code>useState</code> と <code>applyNodeChanges</code> を自前で書くより簡潔になります。より細かい制御が必要な場合は、<code>useState</code> と <code>applyNodeChanges</code> / <code>applyEdgeChanges</code> を組み合わせる書き方も引き続き使えます。</p><p style=\"text-align: start\"><strong>親要素には必ず幅と高さを指定する必要があります。</strong><code>useReactFlow</code> など一部のフックを使う場合は <code>&lt;ReactFlowProvider&gt;</code> で囲みます。</p><p style=\"text-align: start\">Tailwind CSS v4 と併用する場合は、<strong>CSS の読み込み順に注意が必要</strong>です。v4 ではユーティリティクラスとの優先順位の関係で、<code>App.tsx</code> などのコンポーネント側ではなく、<strong>グローバル CSS（</strong><code>global.css</code> や <code>index.css</code> 等）に React Flow のスタイルをまとめてインポートすることが公式で推奨されています。具体的には次のように、<code>tailwindcss</code> を読み込んだ後で React Flow のスタイルをインポートします。</p><pre><code>@import &quot;tailwindcss&quot;;\n\n@layer base {\n  @import &quot;@xyflow/react/dist/style.css&quot;;\n}</code></pre><h2 style=\"text-align: start\" id=\"hb6366a7904\">メリットと制約・注意点</h2><p style=\"text-align: start\">メリット（公式情報・一般論）としては、(1) ノード/エッジ/プラグインの拡張性が高く、独自 UI を段階的に組み込みやすいこと、(2) <strong>MIT ライセンスで商用利用も可能</strong>なこと、(3) v12 で SSR/SSG とダークモードに対応し、TSDoc による型情報も整備されたこと、が挙げられます。一方、注意点としては次のような点が考えられます（一般論・推測を含む）。</p><p style=\"text-align: start\">v11 以前の <code>reactflow</code> パッケージから移行する場合、import 文・型名・一部の API（<code>nodeInternals</code> の再設計、measured 系プロパティへの分離など）の書き換えが必要です（公式の移行ガイド参照）。</p><p style=\"text-align: start\">大量のノード（数千以上）を扱う場合は、カスタムノードの再レンダリング設計や仮想化、サーバー側計算など、個別の最適化が必要になりやすい点に留意してください（推測を含む）。</p><p style=\"text-align: start\">有償の Pro Examples / サポートプランが別途あり、<strong>業務利用ではライセンス条件もあわせて確認するのが安全</strong>です。</p><h2 style=\"text-align: start\" id=\"ha1f141460a\">関連技術と比較観点</h2><p style=\"text-align: start\">近い領域には、同じ xyflow が提供する Svelte Flow、汎用ダイアグラムの JointJS / GoJS、グラフ可視化寄りの Cytoscape.js、より低レベルの D3.js や Konva などがあります。比較観点としては、(a) 編集 UI 重視か可視化重視か、(b) React 等のフレームワーク統合のしやすさ、(c) カスタムノードの自由度と学習コスト、(d) ライセンス（OSS／商用）と長期的なメンテナンス体制、が実務上の判断材料になります。一般論として、React アプリ内で「ユーザーが編集できるノード UI」を作る用途では React Flow が第一候補になりやすい一方、純粋な大規模グラフ解析には Cytoscape.js などのほうが向きます。</p><h2 style=\"text-align: start\" id=\"he005c1ead3\">参考リンク（公式中心）</h2><ul><li><a href=\"https://reactflow.dev/\" target=\"_blank\" rel=\"noopener noreferrer\"><u>React Flow 公式サイト</u></a></li><li><a href=\"https://reactflow.dev/learn\" target=\"_blank\" rel=\"noopener noreferrer\"><u>React Flow 公式 Quick Start</u></a></li><li><a href=\"https://reactflow.dev/examples\" target=\"_blank\" rel=\"noopener noreferrer\"><u>React Flow Examples（公式サンプル集）</u></a></li><li><a href=\"https://reactflow.dev/learn/troubleshooting/migrate-to-v12\" target=\"_blank\" rel=\"noopener noreferrer\"><u>Migrate to React Flow 12（公式移行ガイド）</u></a></li><li><a href=\"https://reactflow.dev/api-reference/react-flow\" target=\"_blank\" rel=\"noopener noreferrer\"><u>公式 API リファレンス: ReactFlow コンポーネント</u></a></li><li><a href=\"https://www.npmjs.com/package/@xyflow/react\" target=\"_blank\" rel=\"noopener noreferrer\"><u>npm: @xyflow/react</u></a></li><li><a href=\"https://github.com/xyflow/xyflow\" target=\"_blank\" rel=\"noopener noreferrer\"><u>GitHub: xyflow/xyflow（公式リポジトリ）</u></a></li></ul>","category":{"category":"AI"}}},"pageContext":{"id":"03ff0628-d7a6-5312-9734-e7dc7810758d"}},"staticQueryHashes":["3649515864","63159454"]}