React Flow(@xyflow/react)入門:v12以降の公式パッケージで作るノードUI

Posted at 2026 年 05 月 16 日

React Flow は、React 上でノードとエッジから成るインタラクティブなグラフ UI(ワークフローエディタ、ダイアグラム、低コードツールの編集画面など)を構築するためのオープンソースライブラリです。v12 の安定版は 2024 年 7 月にリリースされ、これに伴って npm パッケージ名が reactflow から @xyflow/react へ変更されました。開発元の xyflow は、React 版(@xyflow/react)と Svelte 版(@xyflow/svelte)を同じブランドのもとで並行して提供しています。本記事では概要、仕組み、導入手順、注意点、関連技術を短時間で把握できるよう整理します。

React Flow とは何か / 何ができるか

React Flow は「ノードベース UI」を作るためのコンポーネントライブラリです。ドラッグ&ドロップ、ズーム/パン、複数選択、ミニマップ、コントロール、背景グリッドといった基本機能を備えており、加えて <NodeResizer /><NodeToolbar /> などのリサイズ・ツールバー用コンポーネントも標準で提供されています。カスタムノードやカスタムエッジを自由に定義でき、ワークフロー/オートメーション、ETL やデータパイプライン、機械学習や LLM のフロー設計、チャットボットビルダー、ER 図・組織図などの可視化に広く使われています。

仕組みとアーキテクチャの要点

内部はモノレポ構成になっており、@xyflow/system(フレームワーク非依存の共通ロジック)を土台に、@xyflow/react@xyflow/svelte が実装されています。ビューポートの操作には d3-zoom を利用し、変更があったノードのみを再レンダリングする設計のため、規模が大きくなっても比較的軽快に動きます。

v12 の大きな変更点として、ノードに width / height / handles を事前指定できるようになり、これによってサーバー側で計測できない情報を明示的に渡せるようになったため、SSR/SSG にも対応できるようになりました。状態管理は内部のストアで行われ、useReactFlow などのフックを通じて参照できます。v11 までの nodeInternals マップは v12 で再設計され、ノードの実体は nodes 配列に、参照用途は新設の nodeLookup マップに分離されました(nodeLookup は変更のたびに新しいオブジェクトを生成しないため、ルックアップに適した設計です)。

導入手順と最小コード

インストールは公式の Quick Start に従い、パッケージとスタイルを読み込みます。

npm install @xyflow/react

最小構成のコード例は次のとおりです。v12 から ReactFlow は名前付きエクスポートになっている点、CSS の読み込みが必須である点に注意してください。

import { useCallback } from 'react';
import {
  ReactFlow,
  Background,
  Controls,
  MiniMap,
  useNodesState,
  useEdgesState,
  addEdge,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';

const initialNodes = [
  { id: '1', position: { x: 0, y: 0 }, data: { label: 'Start' } },
  { id: '2', position: { x: 200, y: 80 }, data: { label: 'Next' } },
];
const initialEdges = [{ id: 'e1-2', source: '1', target: '2' }];

export default function Flow() {
  const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
  const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
  const onConnect = useCallback(
    (params) => setEdges((eds) => addEdge(params, eds)),
    [],
  );

  return (
    <div style={{ width: '100%', height: 480 }}>
      <ReactFlow
        nodes={nodes}
        edges={edges}
        onNodesChange={onNodesChange}
        onEdgesChange={onEdgesChange}
        onConnect={onConnect}
        fitView
      >
        <Background />
        <Controls />
        <MiniMap />
      </ReactFlow>
    </div>
  );
}

実行してアクセスすると、以下のような画面が表示されます。



公式が提供する useNodesState / useEdgesState フックを使うと、状態と変更ハンドラを一括で取得でき、useStateapplyNodeChanges を自前で書くより簡潔になります。より細かい制御が必要な場合は、useStateapplyNodeChanges / applyEdgeChanges を組み合わせる書き方も引き続き使えます。

親要素には必ず幅と高さを指定する必要があります。useReactFlow など一部のフックを使う場合は <ReactFlowProvider> で囲みます。

Tailwind CSS v4 と併用する場合は、CSS の読み込み順に注意が必要です。v4 ではユーティリティクラスとの優先順位の関係で、App.tsx などのコンポーネント側ではなく、グローバル CSS(global.cssindex.css 等)に React Flow のスタイルをまとめてインポートすることが公式で推奨されています。具体的には次のように、tailwindcss を読み込んだ後で React Flow のスタイルをインポートします。

@import "tailwindcss";

@layer base {
  @import "@xyflow/react/dist/style.css";
}

メリットと制約・注意点

メリット(公式情報・一般論)としては、(1) ノード/エッジ/プラグインの拡張性が高く、独自 UI を段階的に組み込みやすいこと、(2) MIT ライセンスで商用利用も可能なこと、(3) v12 で SSR/SSG とダークモードに対応し、TSDoc による型情報も整備されたこと、が挙げられます。一方、注意点としては次のような点が考えられます(一般論・推測を含む)。

v11 以前の reactflow パッケージから移行する場合、import 文・型名・一部の API(nodeInternals の再設計、measured 系プロパティへの分離など)の書き換えが必要です(公式の移行ガイド参照)。

大量のノード(数千以上)を扱う場合は、カスタムノードの再レンダリング設計や仮想化、サーバー側計算など、個別の最適化が必要になりやすい点に留意してください(推測を含む)。

有償の Pro Examples / サポートプランが別途あり、業務利用ではライセンス条件もあわせて確認するのが安全です。

関連技術と比較観点

近い領域には、同じ xyflow が提供する Svelte Flow、汎用ダイアグラムの JointJS / GoJS、グラフ可視化寄りの Cytoscape.js、より低レベルの D3.js や Konva などがあります。比較観点としては、(a) 編集 UI 重視か可視化重視か、(b) React 等のフレームワーク統合のしやすさ、(c) カスタムノードの自由度と学習コスト、(d) ライセンス(OSS/商用)と長期的なメンテナンス体制、が実務上の判断材料になります。一般論として、React アプリ内で「ユーザーが編集できるノード UI」を作る用途では React Flow が第一候補になりやすい一方、純粋な大規模グラフ解析には Cytoscape.js などのほうが向きます。

参考リンク(公式中心)

DevpediaCode編集部

DevpediaCodeはWeb、AIなどプログラムに関する最新ITテーマの情報を発信するメディアです。

お問合せ下記のURLからお願いします。

https://devpediacode.com/contact