masseater/skills

how-to-use-react

React 19.3 のコンポーネント、ローダー、サーバー処理を書く・直す・レビューするときに読む。状態の置き場所、非同期の組み方、並行 UI の API の使いどころ、props の形を決める。

ソースを見る

使い方

  1. インストールコマンドをコピーし、自分の環境へ導入する前にソースを確認します。
  2. 必要なツール、認証情報、対応環境を原文で確認します。
  3. 入力と成果物を指定し、出力を資料と照合します。
npx skills add https://github.com/masseater/skills --skill how-to-use-react

開始前の確認

  • 導入にはモデル契約、API枠、ファイルへのアクセス許可は含まれません。
  • スター数や導入数は活動の指標であり、独立した品質・安全性試験ではありません。
リポジトリの原文

見出し、例、コード、表、リンク、参照画像を含む原文を表示しています。

how-to-use-react

React 19.3 のコンポーネント、ローダー、サーバー処理を書くときの規則である。masseater/typescript-template から作ったリポジトリ向けに、原典を読み替えてある。読み替えと原典が食い違うときは読み替えを採る。

  • 状態は Effect Atom と TanStack Query に置き分ける
  • 非同期の瀑布を消す
  • React Compiler があるリポジトリでは useMemo、useCallback、memo を書かない
  • 原典にある Next.js、SWR、Redux、better-all は採らない

この skill が必要な理由と達成したい状態

この skill が必要な理由は、React が同じ画面を何通りにも書け、どの書き方でも初めは動くことにある。違いが出るのはデータが増え、通信が遅れ、操作が重なったときで、そのときには直列の取得が瀑布になり、同期の更新が入力を止め、状態が useState と Context とサーバー応答のコピーに散らばっている。書いた時点では、悪い書き方を選んだことに気づけない。

この skill で達成したい状態は、画面がユーザーの操作を止めず、待たせず、どの状態もどこに置くか迷わないことである。

置き分け

やりたいこと使うもの使わないもの
画面の一時状態、フォームの値、ツリーをまたいで共有する値Effect Atom(Atom.make、useAtom、useAtomValue)useState、useReducer、createContext、useContext(no-restricted-imports が拒否する)
サーバーデータTanStack Query(queryOptions は FSD の api セグメント)use(promise) での取得、useEffect と fetch の組み合わせ、Atom にサーバー応答を載せる
ミューテーションの pending と errorTanStack Query の useMutation自前の pending フラグ、useActionState、useFormStatus
順番が仕様のミューテーション同じ scope.id を持つ useMutation自前のキュー、ボタンを無効にして操作列を止める
楽観更新useOptimistic自前の巻き戻し状態
急がない更新・重い派生useTransition / startTransition / useDeferredValueタイマーデバウンス
ref関数の propsforwardRef、文字列 ref
隠しても状態を残す<Activity mode="hidden">条件付きアンマウントで状態を捨てる
遷移のアニメーション<ViewTransition>
Effect で最新の props を使うuseEffectEvent。依存配列には入れないその関数を依存配列に足して購読をやり直す

メモ化

  • React Compiler が有効なリポジトリでは useMemo、useCallback、memo を書かない
  • Compiler が無いリポジトリでは、react-perf のルールが指摘した箇所にだけ useCallback か useMemo を書く
  • それ以外は、計測で遅いと分かってから足す

react-perf が指摘するのは、props に渡す関数やオブジェクトの作り直しである。

非同期の瀑布

`async` も読むこと。React の他の性能の話より先に、この節を当てる。

  • 前の結果を使わない処理は、Effect.all か Effect.forEach に { concurrency: "unbounded" } を渡して同時に始める
  • 順番が仕様なら { concurrency: 1 } と書く。省略しない
  • Effect の外の Promise なら Promise.all を使う
  • 一部だけ依存するときは、依存する側を Effect.flatMap で組み、依存しない側と一つの Effect.all に載せる
ts
const loaded = Effect.all(
  {
    config: fetchConfig,
    profile: fetchUser.pipe(Effect.flatMap((user) => fetchProfile(user.id))),
  },
  { concurrency: "unbounded" },
);

採らない原典の箇所

原典代わり
Next.js(next/dynamic、after()、React cache() をリクエストをまたいで使う)TanStack Start のローダー
SWRTanStack Query
useState / useRef でローディングや一時値を持つuseMutation、useTransition、Effect Atom
better-allEffect.all
ハンドラを ref にしまうuseEffectEvent
Redux の Action / Reducer / SelectorEffect Atom と TanStack Query、FSD の model / api / ui

不確かな API の形は react.dev の該当リファレンスを見る。原典の例を、上の表が使わないとしたフックのまま写さない。

参照

次もすべて読むこと。

タスクに関連する項目

同じリポジトリから

関連する Skills

すべての Skills
masseater
コミュニティ

integrate

ライブラリや新しい実装手段を導入するときに使う。追加するだけで終わらせず、既存コードの移行と、その手段を使わせる機械的な強制まで行う。

導入数
508
GitHub Stars
2
更新日
10月25日
masseater
コミュニティ

measure-dont-guess

仮説を白黒つける計測を実装や修正の前に決めて実行し、その結果だけで判断する。不具合の原因を調べるとき、性能や挙動を比べるとき、新しい機能を書き始めるとき、「たぶん」で判断しそうになったときに使う。

導入数
508
GitHub Stars
2
更新日
10月25日
masseater
コミュニティ

setup-template

masseater/typescript-template から作ったリポジトリを、テンプレートに揃える。GitHub 側の設定を gh で揃え、中身の移行が完了しているかを、テンプレートの骨格が入り、効き、古い形が消えているかで判定する。新しいリポジトリを作ったとき、AI に移行を任せたあとに使う。ほかのリポジトリでも使えるが、その場合は適用する手順をユーザーに確認する。

導入数
504
GitHub Stars
2
更新日
10月25日
masseater
コミュニティ

skill-authoring

Agent Skills の skill、つまり SKILL.md とそのディレクトリを作る・直す・添削するときに読む。本文を skill が必要な理由と達成したい状態から導いて書き、直すときも全体を導き直す。

導入数
503
GitHub Stars
2
更新日
10月25日