reatom-async について
reatom-async は、Reatom の非同期処理に焦点を当てた開発スキルです。非同期フローの実装やレビューに向けて、クエリ、ミューテーション、キャンセル、サンプリング、Suspense の指針を案内します。
主な機能
- 01テーマ別の非同期リファレンス案内
- 02クエリとミューテーションの方式を区別
- 03非同期境界でのコンテキスト規則を説明
- 04キャンセル、競合、スロットリングを網羅
- 05ローディング状態と再試行を案内
活用シーン
- 01Reatom の非同期クエリやコマンドを実装
- 02await 後のコンテキスト処理を確認
- 03キャンセル、スロットリング、競合処理を設計
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ reatom/ reatom --skill reatom-asyncインストール後、Claude Code で/reatom-asyncを入力して読み込まれたか確認します。
同梱ファイルREFERENCE.md
詳細
Reatom Async
タスクの主な内容が Reatom の非同期動作に関する場合に、このスキルを使用してください。同梱されている非同期処理の信頼できる情報源として、REFERENCE.md を参照してください。
使用方法
- タスクに該当する REFERENCE.md のセクションだけを読んでください。
- debounce ライブラリ、マウント時のフェッチ、ref、コンポーネントローカルの Promise 状態、手動での AbortController 管理よりも、Reatom の非同期パターンを優先してください。
- Reatom の一般的なモデリングには
reatomスキルを、@reatom/jsxの DOM JSX 固有の内容にはreatom-jsxを使用してください。レビューには、このスキルとreatom-reviewを組み合わせてください。 - ドキュメント、ソース、テストの内容が食い違う場合は、ソースとテストを優先し、古くなっているドキュメントや例を修正してください。
セクション一覧
- クエリとミューテーション:
Choosing the Primitive、withAsyncData、withAsync await後のコンテキスト:wrap Rules- キャンセル:
withAbort、abortVar and Fetch Signals - デバウンス、スロットル、待機、競合:
Sampling and Procedural Async - Redux-saga からの移行:
Redux-Saga Mapping - ローディング UI と再試行:
Status, Retry, Reset - Suspense:
Suspense Boundaries - コードレビュー:
Common Mistakes、Tested Edge Cases
実装時のデフォルト
- クエリ/データの読み取り:
computed(async () => ...).extend(withAsyncData({ initState }))。 - コマンド/ミューテーション:
action(async () => ...).extend(withAsync(...))。古くなった呼び出しを停止する必要がある場合は、withAbort(...)を追加してください。 - Reatom フレームを抜けるすべての非同期境界では、
await wrap(promise)を使用します。 - Reatom の状態/アクションを呼び出す外部コールバックは、
wrap(fn)として渡すか、onEventに接続します。 - キャンセル可能なフェッチでは、
signal: abortVar.require().signalまたはスコープ付きのabortVar.subscribe()を使用します。 - デバウンスとスロットルはサンプリングのドキュメントに従います。フロー内で
await wrap(sleep(ms))を使用し、withAbort()の戦略と組み合わせます。分離したデバウンス用ヘルパーは使用しません。 - ルート/ページのデータは、コンポーネントのエフェクトではなく、ルートローダーまたは非同期 computed に配置します。
- フォーム送信は非同期ミューテーションです。手書きの送信アクションやデバウンス付きバリデーターを使う代わりに、
reatomForm({ onSubmit })に設定し、非同期/依存関係のあるチェックにはフィールドのvalidateを使用してください(デバウンスにはawait wrap(sleep(ms))を使用します)。 - Suspense は動的なページデータではなく、グローバルな一度きりの初期化に使用します。
レビュー時のデフォルト
- アトム/アクションの呼び出し前に
wrapされていないawaitがあれば、指摘してください。 - クエリデータには
.dataを管理するwithAsyncDataを使うべきところで、withAsyncを使っている場合は指摘してください。 - 古くなったコマンド呼び出しが状態を更新する可能性があるのに、
withAbortなしでwithAsyncを使っている場合は指摘してください。 { status: true }を指定せずに.status()を使っている場合は指摘してください。{ cacheParams: true }を指定せずにアクションの.retry()を使っている場合は指摘してください。withAsync()/withAsyncData()より前にwithCache()を使っている場合は指摘してください。- 中断を業務エラーとして表示している場合は指摘してください。
- 敗者側のクリーンアップが必要なのに、生の
Promise.raceを使っている場合は指摘してください。
コメント
Markdown 対応