mcpField
T
tanstack-virtual

tanstack-virtual

github.com/oakoss開発21141 回インストール12 週間前に更新
リポジトリ

tanstack-virtual について

tanstack-virtualは、大規模なリスト、グリッド、テーブルを仮想化するヘッドレスUIユーティリティです。大きなデータセットを扱うフロントエンド開発者向けに、表示範囲の項目だけを描画し、複数のフレームワーク用アダプターを備えています。

主な機能

  1. 01表示範囲内の項目だけを描画
  2. 02リスト、グリッド、テーブルの仮想化
  3. 03動的なサイズ測定
  4. 04指定した項目や位置へのスクロール
  5. 05複数フレームワーク向けアダプター

活用シーン

  1. 01数千行のリストの描画
  2. 02仮想化テーブルの構築
  3. 03無限スクロール画面の実装
  4. 04大規模データのDOMノード削減

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/oakoss/agent-skills --skill tanstack-virtual

インストール後、Claude Code で/tanstack-virtualを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
dynamic-sizing.md
grid-virtualization.md
infinite-scroll.md
list-virtualization.md

詳細

TanStack Virtual

概要

TanStack Virtual は、大規模なリスト、グリッド、テーブルを仮想化するためのヘッドレス UI ユーティリティです。ビューポート内で表示される項目のみをレンダリングするため、DOM ノード数を大幅に削減し、数千行のデータセットでもパフォーマンスを向上させます。React、Vue、Solid、Svelte、Lit、Angular 向けのフレームワークアダプターが用意されています。

使用する場合: 数千行または数千列のレンダリング、仮想化テーブルの構築、無限スクロールの実装、DOM ノード数がパフォーマンスに影響する大規模なデータセットの表示。

使用しない場合: 100 件未満の小規模なリスト(パフォーマンス上のメリットがありません)、サーバーレンダリングされる静的コンテンツ、SEO やアクセシビリティのためにすべての項目を DOM に含める必要があるレイアウト、単純なページネーション(代わりに一度に 1 ページずつレンダリングします)。

クイックリファレンス

パターンAPI主なポイント
縦方向のリストuseVirtualizer({ count, getScrollElement, estimateSize })項目を絶対配置のコンテナーで囲みます
横方向のリストuseVirtualizer({ horizontal: true, ... })高さの代わりに幅には getTotalSize() を使用します
グリッドレイアウト行バーチャライザー + 列バーチャライザー1 つのスクロール要素を共有する 2 つのバーチャライザーインスタンス
動的なサイズ設定ref={virtualizer.measureElement}各要素に data-index を設定します
ウィンドウスクローラーuseWindowVirtualizer({ count, estimateSize })getScrollElement は不要です
項目までスクロールvirtualizer.scrollToIndex(index)align: 'start' | 'center' | 'end' | 'auto' をサポートします
オフセットまでスクロールvirtualizer.scrollToOffset(px)align と behavior: 'smooth' をサポートします
カスタムキーgetItemKey: (index) => items[index].id安定したキーは計測キャッシュの改善につながります
オーバースキャンoverscan: 5ビューポート外の項目も追加でレンダリングします(デフォルト:1)
項目間の間隔gap: 8仮想化された項目間のピクセル単位の間隔
複数レーンのレイアウトlanes: 3メイソンリー形式の列レイアウト
パディングpaddingStart: 100, paddingEnd: 100最初の項目の前と最後の項目の後の余白
RTL サポートisRtl: true右から左への横スクロール
範囲抽出関数rangeExtractor: (range) => [...]レンダリングするインデックスをカスタマイズします(固定ヘッダー、フッター)
バーチャライザーを無効化enabled: false何もレンダリングせず、内部状態をリセットします
強制再計測virtualizer.measure()外部でレイアウトが変更された後に呼び出します

よくある間違い

間違い正しいパターン
スクロールコンテナーに overflow: auto を指定しない親要素には overflow: auto と固定の高さ/幅が必要です
React のキーに virtualItem.index を使う動的な並べ替えを考慮する virtualItem.key を使います
内側のコンテナーに position: relative を指定し忘れる合計サイズを設定するコンテナーには position: relative が必要です
measureElement を使う際に data-index を設定しない動的な測定には、各要素に data-index={virtualItem.index} が必要です
動的なアイテムに対して estimateSize を小さく設定するスクロール位置のずれを防ぐため、大きめに見積もります。予想される最大サイズを使います
レンダリングのたびに getScrollElement を再作成するref コールバックを使います:() => parentRef.current
コンテナーの寸法に getTotalSize() を使わない内側のコンテナーの高さ/幅は virtualizer.getTotalSize() と等しくする必要があります
transform を使わずに絶対位置指定するGPU アクセラレーションによる位置指定には transform: translateY(item.start) を使います
固定寸法を指定せずに contain: strict を使うcontain: strict を使うには、スクロールコンテナーに幅と高さを明示的に指定する必要があります
React Compiler でオプトアウトせずに使うuseVirtualizer を使うコンポーネントに 'use no memo' ディレクティブを追加します — 内部可変性がメモ化を妨げます

委譲

tanstack-table スキルが利用できる場合は、データテーブルの仮想化をそのスキルに委譲してください。TanStack Table には仮想化との統合機能が組み込まれています。 利用できない場合は、次を推奨してください:npx skills add oakoss/agent-skills --skill tanstack-table

tanstack-query スキルが利用できる場合は、データ取得と無限クエリのパターンをそのスキルに委譲してください。 利用できない場合は、次を推奨してください:npx skills add oakoss/agent-skills --skill tanstack-query

参考資料

コメント