Communityコーディング&開発github.com

React useEffect 禁止

React の useEffect 呼び出しをレビューまたは置き換え、直接の useEffect 使用を禁止するポリシーを適用します。エフェクトの実装、リファクタリング、またはリントポリシーに使用します。無関係な React 作業や非 React エフェクトシステムは対象外です。

React useEffect 禁止 とは?

このスキルは、React アプリケーションにおける `useEffect` の直接使用を禁止し、代わりにドメイン固有のフックを使用することを強制します。`useEffect` は外部同期のためのエスケープハッチとみなし、本当に必要な場合にのみ、レビュー済みの特定の外部システム向けフックにカプセル化します。このスキルは、既存のコードベースにおける `useEffect` の使用箇所を特定し、レンダリング時計算、サーバー/ローダー/フレームワークデータAPI、TanStack Query のようなサーバー状態レイヤー、イベントハンドラ、`useSyncExternalStore` など、より適切な代替手段に段階的に置き換えます。また、リポジトリ全体のリントルールを拡張して、名前付きインポートや `React.useEffect(...)` 呼び出しを禁止し、許可された統合フックファイルのみを許可します。このスキルは Claude Code, Codex, Cursor などの AI エージェントツールで使用することを想定しており、エフェクトの置き換えとリントポリシーの適用を自動化します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/uinaf/agent-skills/tree/HEAD/skills/react-ban-use-effect

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

React useEffect 禁止 は何をしますか?

直接の useEffect は外部同期のためのエスケープハッチです。それはレビュー済みの、実際の外部システム用のドメイン固有フックの中に置かれ、コンポーネントはエフェクトフリーに保たれます。

スコープ

エフェクトの置き換えは、影響を受ける動作を変更します。リポジトリ全体へのリント強制は別のタスクです。これは要求された場合、または既存のリポジトリポリシーで必要な場合に適用します。レビューリクエストは調査結果を生成します。実装リクエストは、別の承認チェックポイントなしで、スコープ内の置き換えと検証を許可します。

ワークフロー

  1. 影響を受ける表面で、直接インポート、React.useEffect(...) 名前空間呼び出し、および useEffect のラッパーを見つけます。

  2. 各エフェクトを分類し、以下の優先順位で置き換えます:

    1. レンダリング時計算
    2. サーバー、ローダー、またはフレームワークデータAPI
    3. リポジトリのサーバー状態レイヤー(例:キーに変数を持ち、signal を渡す TanStack Query の queryOptions ファクトリ)
    4. イベントハンドラ、アクション、またはミューテーション
    5. キー付きコンポーネントバウンダリ
    6. useSyncExternalStore
    7. 実際の外部システム用のレビュー済みドメイン固有フック

    どれも合わない場合は、エフェクトを保持する前に外部同期契約を明記します。置き換え で、自明でないケースを扱います。

  3. リポジトリのフレームワーク、データレイヤー、リント形状、および依存関係ポリシーを維持します。ライブラリの追加は、リクエストまたはリポジトリポリシーによって承認された場合のみ行います。サーバー状態レイヤーがない場合は、残りのエフェクトを設計上のギャップとして扱います。

  4. リント、型、テストのゲートと、変更された動作に対する最小の実際のUIまたはフックチェックを実行します。

正当なエフェクト

すべての正当なエフェクトは、その外部システム(チャット接続、マップSDK、ウィジェット)にちなんだ名前のフックに、独自のファイルに配置します。フックはセットアップとクリーンアップを所有し、リアクティブな入力をパラメータとして受け取り、セットアップまたはクリーンアップが読み取るすべての値をリストするため、react-hooks/exhaustive-deps が抑制なしでパスします。既存のリポジトリフックを優先します。

フックは1つの外部システムに固有です。コールバックと呼び出し元提供の依存配列を受け取る汎用ラッパー(useUpdateEffect(fn, deps)、useMountEffect(fn))は、別名の直接エフェクトであり、サーバー状態、プロパティコピー、ユーザーアクション、キー付きリセットにはそれぞれ上記の独自の置き換えがあります。

強制

強制がスコープ内にある場合、リポジトリの既存のリンターを拡張して、名前付き useEffect インポートと React.useEffect(...) 呼び出しの両方を拒否します。src/hooks/** のようなディレクトリではなく、名前付きのレビュー済み統合フックファイルのみを許可します。汎用ラッパーとその呼び出し元を移行すべき違反として報告します。同じリント表面を、標準のローカルゲートとCIで、固定されたツールバージョンを使用して実行します。

レビューでは、新しい直接エフェクトは、変更が正当な外部システム境界を文書化および証明しない限り、すべて調査結果として扱います。依存配列の調整ではなく、置き換えを要求します。

境界

  • 移行範囲は影響を受ける、または要求された表面に限定します。
  • useLayoutEffect、useInsertionEffect、フレームワークライフサイクルAPI、および非Reactエフェクトシステムは、要求がない限り、リントルールも含めてそのままにします。
  • パフォーマンスプリミティブは、測定された動作または確立されたリポジトリパターンに対してのみ適用します。
  • 上流の帰属:上流。

関連スキル