fox-optimize について
fox-optimizeは、ページ、データベース、API、メモリ、アニメーションの性能問題を調査・改善する開発スキルです。事前に計測し、根拠をもとにボトルネックを特定して、変更後に検証します。
主な機能
- 01最適化前の性能基準を計測
- 02根拠に基づくボトルネック特定
- 03画像、JavaScript、データベースなどを改善
- 04CIと性能計測による変更の検証
- 05変更前後の指標を記録
活用シーン
- 01ページ読み込みの遅さを調査
- 02遅いデータベースクエリやAPIを改善
- 03JavaScriptバンドルのサイズ削減
- 04メモリ増加やアニメーションのカクつきを調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ autumnsgrove/ lattice --skill fox-optimizeインストール後、Claude Code で/fox-optimizeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/measurement-tools.mdoptimization-patterns.mdperformance-toolkit.mdscripts/measure-bundle.sh詳細
Fox Optimize 🦊
キツネは森をのろのろと進みません。木々の間を最速で抜ける道を見つけ、素早く正確に移動します。狩りの妨げになるものがあれば、キツネはすぐに気づきます。問題に忍び寄って原因を特定し、仕留めます。キツネが通り過ぎた後、森の流れはよりスムーズになります。
有効にするタイミング
- ユーザーが「これを最適化して」や「もっと速くして」と依頼したとき
- ユーザーが「遅い」や「パフォーマンスの問題」と言ったとき
/fox-optimizeを呼び出したとき、またはキツネ/パフォーマンスに言及したとき- ページの読み込み時間が許容できないとき
- データベースクエリの応答が遅いとき
- バンドルサイズが大きすぎるとき
- メモリリークが検出されたとき
- アニメーションがカクつくとき
- API の応答時間が遅いとき
組み合わせるもの: bloodhound-scout で遅いコードパスを見つけます
狩り
STALK → PINPOINT → STREAMLINE → CATCH → CELEBRATE
↓ ↲ ↲ ↓ ↓
Watch for Find the Optimize Capture Enjoy the
Slowness Bottleneck Hot Paths Gains Win
フェーズ 1:STALK
キツネは音もなく歩き、動きが遅すぎるものを見張ります……
何かに手を加える前に、ベースラインのメトリクスを記録します。
- 何が遅く感じるかを特定します。初回読み込み、操作、スクロール、データ読み込み、画面遷移のどれでしょうか?
- 適切なツールで測定します。ページ指標には Lighthouse、サイズにはバンドルビジュアライザー、CPU/メモリには DevTools を使います
- 比較用の目標メトリクスとベースラインを設定します
リファレンス: references/measurement-tools.md を読み込み、Lighthouse のコマンド、バンドル分析の設定、データベースクエリのプロファイリング、DevTools ガイド、パフォーマンス目標値を確認します
スクリプト: scripts/measure-bundle.sh を実行して、すべてのアプリのベースラインとなるバンドルサイズを記録します。最適化後にもう一度実行すると、最適化前後の比較が自動的に行われます。
リファレンス: references/performance-toolkit.md を読み込み、Grove 固有の測定コマンドを確認します。3 つすべてのデータベースにおける D1 クエリのプロファイリング、KV キャッシュのパターン、Workers 固有の並列化、パフォーマンスレポートのテンプレートが含まれています
出力: ベースラインのメトリクスと目標を定義します
フェーズ 2:PINPOINT
耳をそばだて、キツネは獲物が隠れている場所を正確に突き止めます……
証拠に基づいて、具体的なボトルネックを見つけます。
- サーバーのライフサイクル:フック/ミドルウェアで順次実行される await、Promise.all によるバッチ処理、条件に応じた処理のスキップ、エッジキャッシュヘッダー、DO のコールドスタートを確認します
- フロントエンド:Long Tasks、レイアウトのスラッシング、ブロッキング JS、最適化されていない画像、大きなバンドルを確認します
- データベース:EXPLAIN QUERY PLAN を実行し、SEARCH ではなく SCAN が使われていないかを確認して、N+1 パターンを特定します
- API:応答時間、並列化の機会、キャッシュの不足を確認します
- メモリ:ヒープスナップショットを取得し、ユーザー操作の前後で比較して、ヒープが増え続けていないかを確認します
80/20 の法則:SSR アプリでは、まず TTFB を確認します。サーバーが遅い場合、クライアント側の最適化では改善できません。その後、画像、インデックス、キャッシュ、JS バンドルサイズを確認します。
リファレンス: references/optimization-patterns.md を読み込み、症状と考えられる原因を対応づけた診断用の決定木を確認します
出力: 証拠に基づいて具体的なボトルネックを特定します
フェーズ 3:STREAMLINE
キツネは茂みを抜ける最速の道を見つけます……
対象を絞って最適化を適用します。すべてではなく、ボトルネックを解消します。
- 画像:WebP/AVIF に変換し、遅延読み込みを追加し、レスポンシブなサイズに対応する srcset を追加します
- JS:重いコンポーネントをコード分割し、インポートをツリーシェイキングし、スクロールせずに見える範囲より下のコンテンツを遅延読み込みします
- データベース:複合インデックスを追加し、JOIN で N+1 クエリを修正し、独立したクエリを並列化します
- キャッシュ:コストの高い読み取りには KV キャッシュを使い、静的アセットには cache-control ヘッダーを設定します
- アニメーション:transform/opacity のみを使い(GPU 合成)、レイアウトを発生させるプロパティを避けます
- メモリ:onDestroy でクリーンアップし、イベントリスナーを削除します
リファレンス: references/optimization-patterns.md を読み込み、画像、コード分割、N+1 の修正、並列クエリ、KV キャッシュ、メモ化、仮想スクロール、アニメーションのパフォーマンス、メモリリークの修正など、すべての最適化パターンのコード例を確認します
出力: 変更範囲を最小限に抑えて最適化を適用します
フェーズ 4:CATCH
キツネが顎を鳴らし、スピードをつかまえます……
必須:最適化によって問題が発生していないことを確認してください:
pnpm install
gw ci --affected --fail-fast --diagnose
検証に失敗した場合:キツネが速く動きすぎて、何かを壊してしまいました。診断結果を確認し、リグレッションを修正して、検証を再実行してください。正しさのないスピードに価値はありません。
CI がパスしたら、改善度を測定します:
lighthouse https://yoursite.com
npm run build && npm run analyze
レポート用に変更前と変更後を記録してください。
出力: 検証済みの改善内容を記録
フェーズ 5:CELEBRATE
キツネが喜びの声を上げ、狩りは完了です……
成功を報告し、リグレッションを防ぎます。
- パフォーマンスレポートを作成します:目標、見つかったボトルネック、適用した最適化、変更前と変更後の指標
- CI にパフォーマンス予算を追加し、成果がいつの間にか失われないようにします
- まだ有効になっていない場合は、Real User Monitoring(RUM)を有効にします
出力: レポートを提出し、モニタリングを設定
参照先ルーティング表
| フェーズ | 参照先 | 読み込むタイミング |
|---|---|---|
| STALK | references/measurement-tools.md | 常時(最適化の前に必ず測定します) |
| STALK | references/performance-toolkit.md | Grove 固有:D1 プロファイリング、KV キャッシュ、バンドルの追跡 |
| STALK | scripts/measure-bundle.sh | バンドルサイズのベースライン測定と比較を自動化するために実行 |
| PINPOINT | references/optimization-patterns.md | 原因を特定するために決定木を使用 |
| STREAMLINE | references/optimization-patterns.md | 適切な修正パターンを適用 |
| STREAMLINE | references/performance-toolkit.md | Grove 固有:Workers の並列化、キャッシュヘッダー |
| CELEBRATE | references/performance-toolkit.md | パフォーマンスレポートのテンプレートを使用 |
キツネのルール
スピード
キツネは素早く動きます。小さな最適化に何週間も費やさないでください。まず大きな改善を見つけましょう。
正確さ
実際のボトルネックを狙いましょう。まずプロファイルを取り、その後で最適化します。推測は禁物です。
バランス
速くても壊れていては意味がありません。最適化のたびに機能を検証してください。
コミュニケーション
狩りにまつわる比喩を使いましょう:
- 「遅い経路を追跡中……」(問題を特定)
- 「獲物を狙い定めています……」(ボトルネックを発見)
- 「経路を最適化中……」(最適化)
- 「捕獲を確認……」(改善を検証)
アンチパターン
キツネは次のことをしません:
- 先に測定せずに最適化する
- わずかな改善のために可読性を犠牲にする
- わずかな改善のために複雑さを加える
- 変更後のテストを忘れる
- あらゆるものを早まって最適化する
狩りの例
ユーザー: 「ダッシュボードの読み込みが遅いです」
キツネの流れ:
-
🦊 STALK — 「測定結果:FCP 3.2s、LCP 5.1s。目標:FCP < 1.8s」
-
🦊 PINPOINT — 「Lighthouse:レンダリングをブロックする JS、最適化されていない画像、キャッシュなし。データベース:ウィジェットデータの取得で N+1 クエリが発生。」
-
🦊 STREAMLINE — 「重要度の低い JS を遅延実行し、画像を WebP に変換し、DB インデックスを追加し、KV キャッシュを実装」
-
🦊 CATCH — 「FCP:3.2s → 1.4s。LCP:5.1s → 2.2s。テストにパス。」
-
🦊 CELEBRATE — 「CI にパフォーマンス予算を追加し、RUM モニタリングを有効化」
クイック判断ガイド
| 症状 | 考えられる原因 | すぐにできる対処 |
|---|---|---|
| TTFB が高い(>500ms) | フック/ミドルウェアでの逐次的な await | Promise.all または Promise の先行生成で並列化 |
| ゲストでも遅い | SSR ページでエッジキャッシュなし | Cache-Control + CDN-Cache-Control ヘッダーを追加 |
| ログイン時のみ遅い | 認証/機能のための追加クエリ | 匿名ユーザーには不要な処理を省略 |
| 最初のリクエストが非常に遅い | DO/Worker のコールドスタート | keepalive crons を追加し、設定に KV フォールバックを用意 |
| 初回読み込みが遅い | JS バンドルが大きい | コード分割、ツリーシェイキング |
| 画像の読み込みが遅い | 最適化されていない形式 | WebP/AVIF、遅延読み込み |
| スクロールがカクつく | レイアウトスラッシング | transform を使用し、レイアウト変更を避ける |
| API が遅い | DB インデックスがない | インデックスを追加し、キャッシュを実装 |
| メモリが増加し続ける | リスナーのリーク | onDestroy で適切にクリーンアップ |
| 操作の反応が遅い | メインスレッドがブロックされている | 処理を Web Workers に移す |
すばしこいキツネは、遅い森を後にします。 🦊