mcpField
R
react-map-gl

react-map-gl

github.com/fixmyberlin開発082 回インストール5 日前に更新
リポジトリ

react-map-gl について

FixMyBerlin / FMC プロジェクト向けに、`react-map-gl/maplibre` を使った MapLibre 開発とレビューの規約をまとめたスキルです。React のレイヤー、イベント、地図状態、テスト時の確認方法を扱います。

主な機能

  1. 01宣言的なソースとレイヤーのパターン
  2. 02地図イベントとアクセスの規約
  3. 03ロード状態のガードとデバッグ公開
  4. 04フィーチャー選択とハイライトのルール
  5. 05URL とビューポートの同期

活用シーン

  1. 01地図のソースやレイヤー変更のレビュー
  2. 02フィーチャーのクリックやホバー処理の実装
  3. 03地図表示と URL 状態の同期
  4. 04エージェントや E2E テストでの地図確認

インストール

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

$npx skills add https://github.com/fixmyberlin/fixmyskills --skill react-map-gl

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

同梱ファイル

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

references/
cursor-handling.md
declarative-source-layer.md
feature-state.md
flat-source-layer.md
initial-view-state.md
interactive-layer-ids.md
layer-visibility-vs-unmount.md
map-debug-exposure.md
map-event-handlers.md
map-images.md
map-loaded-hook.md
map-props-attribution-locale.md
map-provider-wrapper.md
map-url-state.md

詳細

react-map-gl (MapLibre)

FixMyBerlin / FMC プロジェクトにおける react-map-gl/maplibre の規約です。react-map-gl 単体ではなく、react-map-gl/maplibre からインポートしてください。必ず maplibre-gl/dist/maplibre-gl.css をインポートしてください。

import 'maplibre-gl/dist/maplibre-gl.css'
import { MapProvider, Map, Source, Layer, useMap } from 'react-map-gl/maplibre'

ルール

トピックルール
ソース/レイヤーJSX 内では <Source> と <Layer> のみを使用します。アプリのデータに対して map.addSource / map.addLayer(または remove*)を呼び出してはいけません。layout.visibility または条件付きレンダーで表示/非表示を切り替えます。
レイヤー構造フラットな兄弟要素にします。ソース ID ごとに <Source> を 1 つ置き、その後に <Layer> を兄弟要素として配置します(ネストしません)。
マップイベントカメラ、ポインター、読み込み、タイルのライフサイクルに関するイベントは、<Map> のコールバックプロパティに指定します。useEffect と map.on(…) の組み合わせは使いません。useEffect は、読み込み後の React → マップの同期、または Map のプロパティにないイベント(styleimagemissing)にのみ使用します。
マップへのアクセスアプリのマップ UI は <MapProvider> でラップします。useMap() は <Map id="…"> で指定した ID を使います。子コンポーネントからアクセスするために <Map> に ref を渡してはいけません。
マップの準備完了useMapLoaded()(onLoad で設定)を使って、getStyle、queryRenderedFeatures、setFeatureState の呼び出し前に準備完了を確認します。
デバッグ用の公開onLoad で exposeMainMapForDebugging(event.target) を呼び出します(開発環境と Playwright でのみ使用)。エージェント/テストは window.__mainMap を参照します。
クリックレイヤー ID は interactiveLayerIds に指定し、event.features を読み取ります。URL のフィーチャーを同期する場合を除き、主要なクリック対象の取得に queryRenderedFeatures を使ってはいけません。
フィーチャーの強調表示インスペクター/フォームの状態は React を正とし、マップの色調変更には setFeatureState(paint)または React の filter レイヤーを使います。新しい状態を適用する前に、古い状態をクリアします。
帰属表示<Map> では attributionControl={false} を指定し、子要素として <AttributionControl compact> を配置します。すべての <Map> で RTLTextPlugin={false} を指定します。
ビューポート URLズームに応じて丸めた zoom/lat/lng を使います。onMoveEnd で history: 'replace' を指定して書き込みます。
ビュー状態URL を初期値とする非制御の initialViewState を使います。プログラムによるカメラ操作が必要な場合を除き、React でビュー状態をミラーリングしません。

読むファイル

自分のタスクに該当するファイルだけを読んでください。

タスク読むファイル
<Source> / <Layer> の追加またはレビュー、addSource の削除declarative-source-layer.md、flat-source-layer.md
レイヤーの表示/非表示layer-visibility-vs-unmount.md
クリック/ホバーのハンドラー、<Map> のコールバックの選択map-event-handlers.md、interactive-layer-ids.md
フィーチャー上のカーソルcursor-handling.md
子コンポーネント/兄弟コンポーネントでマップインスタンスが必要な場合map-provider-wrapper.md
読み込み前の getStyle / queryRenderedFeaturesmap-loaded-hook.md
エージェント/E2E でのマップ検査map-debug-exposure.md
選択/ホバーしたフィーチャーのハイライト、setFeatureStatefeature-state.md
初期カメラ、fitBounds、境界initial-view-state.md
?map= URL の同期map-url-state.md
帰属表示、ロケール、RTL テキストプラグインmap-props-attribution-locale.md
アイコンの欠落または動的アイコン、styleimagemissing、addImagemap-images.md

すべてのファイルは references/ にあります。スキル tanstack-router-conventions(?map= の契約)、zustand-state-management(useMapLoaded ストア)、playwright-skill(E2E マップヘルパー)と組み合わせてください。

レビューチェックリスト

  • アプリデータに対して addSource / addLayer / removeSource / removeLayer / setLayoutProperty を使用していないこと。フラットな <Source> + <Layer> を使用すること
  • <MapProvider> を親に配置し、useMap() を使用すること。<Map> に ref を指定しないこと
  • 移動/クリック/ホバーに useEffect + map.on を使用していないこと。ビューポートの同期には onMoveEnd / onMove を使用すること
  • マップを操作するエフェクトが React → map の同期であり、mainMap + mapLoaded でガードされていること
  • onLoad がマップ準備完了フラグを設定し、exposeMainMapForDebugging を呼び出すこと
  • クリック可能なレイヤー ID がすべて interactiveLayerIds に含まれていること。ハンドラーでは event.features を使用すること
  • 新しいフィーチャーの状態を適用する前に、古いフィーチャーの状態がクリアされていること。フィーチャーに ID があること(ベクターでは promoteId)
  • attributionControl={false} + 子の <AttributionControl> を使用すること。RTLTextPlugin={false} を指定すること
  • URL:共有の parseMapParam / serializeMapParam を使用すること。パン/ズーム時は replace を使用し、シリアライズした値を encodeURIComponent で囲まないこと
  • 固定アイコンには useMapImages を使用すること。動的アイコンには useEffect 内の styleimagemissing を使用し、off() でクリーンアップし、hasImage でガードすること

コメント