web-perf · git:20261002.c0e127d · 2026-10-02 · sha256 47aeea396173ddbe
web-perf git:20261002.c0e127dA
Immutable. This exact content never changes and is served at /api/v1/blob/47aeea396173ddbe.
--- name: web-perf description: Chrome DevTools MCPを使ってWeb performanceを分析する。Core Web Vitals(LCP、INP、CLS)とFCP、TBT、Speed Indexを計測し、render-blocking resources、network dependency chains、layout shifts、cache、accessibilityの問題を特定する。表示速度の監査・計測・デバッグ・最適化、Lighthouse scoreの改善で使用する。既定スタックの必須スキルではないoptional群であり、要件で明示された場合、またはapp-orchestratorがv1前の計測として指示した場合のみロードする。事前学習の知識より最新の公式ドキュメントを優先する。 --- > 本ファイルは cloudflare/skills(Apache-2.0)を基に改変しています。詳細は リポジトリルートの ATTRIBUTION.md を参照。 # Web Performance監査 Web performanceの計測名、閾値、tooling APIsは更新される。具体値や推奨を示す前に、**事前学習の知識ではなく最新の公式情報を取得する**。 ## 最新情報の取得先 Cloudflare製品ではないため`cloudflare-docs` MCPは使わず、次のWebページを第一手段にする(列構成はキット共通)。 | 取得先 | 取得方法 | 使う場面 | |--------|----------|---------| | web.dev | `https://web.dev/articles/vitals` を取得 | Core Web Vitalsの閾値と定義 | | Chrome DevTools docs | `https://developer.chrome.com/docs/devtools/performance` を取得 | Tooling APIsとtrace analysis | | Lighthouse scoring | `https://developer.chrome.com/docs/lighthouse/performance/performance-scoring` を取得 | score weightsとmetric thresholds | ## 最初にMCP toolsを確認する **監査開始前に必ず行う。** `navigate_page`または`performance_start_trace`を呼び出す。利用できなければchrome-devtools MCP serverが未登録なので、計測したように報告せず、**エージェントが登録を代行する**(利用者にコマンドを打たせない。方針は`app-orchestrator`のMCP接続原則と同じ)。登録後にclientを再起動し、上記toolを再確認してから監査へ進む。 ```bash # Claude Code(user scope。作業フォルダに依らず使える) claude mcp add chrome-devtools --scope user -- npx -y chrome-devtools-mcp@latest # Codex codex mcp add chrome-devtools -- npx -y chrome-devtools-mcp@latest ``` `claude` / `codex` コマンドが無い環境では登録をスキップし、計測を未実施として残課題に1行残す。 ## 分析原則 - **根拠を確定する**: network requests、DOM、codebaseで確認した事実だけを断定的に述べる。 - **推奨前に検証する**: 削除を提案する前に未使用であることを確認する。 - **影響を数値化する**: insightsのestimated savingsを使う。0msの改善は優先項目にしない。 - **問題でない項目は分ける**: render-blocking resourcesのestimated impactが0msなら記録のみとし、改善対象にしない。 - **具体的に書く**: 「画像を最適化」ではなく、例えば「`hero.png` (450KB)をWebPへ圧縮」と示す。 - **実測値で優先順位を付ける**: 十分高速な項目はそのように報告し、不要な改修を増やさない。 ## Tool call早見表 | 目的 | Tool Call | |------|-----------| | ページを開く | `navigate_page(url: "...")` | | traceを開始する | `performance_start_trace(autoStop: true, reload: true)` | | insightを分析する | `performance_analyze_insight(insightSetId: "...", insightName: "...")` | | requests一覧を取得する | `list_network_requests(resourceTypes: ["Script", "Stylesheet", ...])` | | request詳細を取得する | `get_network_request(reqid: <id>)` | | accessibility snapshotを取得する | `take_snapshot(verbose: true)` | ## 監査フロー 次のchecklistで進捗を管理する。 ``` 監査の進捗: - [ ] 手順 1: Performance traceを取得 - [ ] 手順 2: Core Web Vitalsを分析(CLSの原因を含む) - [ ] 手順 3: Networkを分析 - [ ] 手順 4: Accessibility snapshotを取得 - [ ] 手順 5: Codebaseを分析(第三者siteは省略) ``` ### 手順 1: Performance traceの取得 1. 対象URLを開く。 ``` navigate_page(url: "<target-url>") ``` 2. reload付きでperformance traceを開始し、cold-load metricsを取得する。 ``` performance_start_trace(autoStop: true, reload: true) ``` 3. trace完了を待って結果を取得する。 **トラブル時:** - traceが空または失敗なら、先に`navigate_page`でページが正常に開いたか確認する - insight nameが一致しない場合は、trace responseから利用可能なinsightsを確認する ### 手順 2: Core Web Vitalsの分析 `performance_analyze_insight`で主要metricsを取得する。 **注意:** insight namesはChrome DevToolsのversionで変わることがある。動作しない場合は、trace responseの`insightSetId`から利用可能なinsightsを確認する。 主なinsight names: | Metric | Insight Name | 確認内容 | |--------|--------------|------------------| | LCP | `LCPBreakdown` | TTFB、resource load、render delayの内訳 | | CLS | `CLSCulprits` | layout shiftsを起こす要素(寸法のない画像、後から挿入されるcontent、font swap) | | Render Blocking | `RenderBlocking` | first paintを妨げるCSS / JS | | Document Latency | `DocumentLatency` | server response timeの問題 | | Network Dependencies | `NetworkRequestsDepGraph` | critical resourcesを遅らせるrequest chains | 例: ``` performance_analyze_insight(insightSetId: "<id-from-trace>", insightName: "LCPBreakdown") ``` **主要閾値(good / needs-improvement / poor):** 下記は早見表であり、報告時は上記公式sourceの最新値を確認し、確認日を付ける。 - TTFB: < 800ms / < 1.8s / > 1.8s - FCP: < 1.8s / < 3s / > 3s - LCP: < 2.5s / < 4s / > 4s - INP: < 200ms / < 500ms / > 500ms - TBT: < 200ms / < 600ms / > 600ms - CLS: < 0.1 / < 0.25 / > 0.25 - Speed Index: < 3.4s / < 5.8s / > 5.8s ### 手順 3: Networkの分析 全network requestsを取得し、改善候補を特定する。 ``` list_network_requests(resourceTypes: ["Script", "Stylesheet", "Document", "Font", "Image"]) ``` **確認項目:** 1. **Render-blocking resources**: `<head>`内で`async` / `defer` / `media` attributesのないJS / CSS 2. **Network chains**: 先に読まれるresourceへの依存で発見が遅れるresource(CSS imports、JS-loaded fontsなど) 3. **Missing preloads**: preloadされていないcritical resources(fonts、hero images、key scripts) 4. **Caching issues**: 不足または弱い`Cache-Control`、`ETag`、`Last-Modified` headers 5. **Large payloads**: 未圧縮または過大なJS / CSS bundles 6. **Unused preconnects**: 対象originへのrequestが0件であることを確認できた場合だけ削除を推奨する。requestが存在し後から読まれるならpreconnectに価値が残る。 requestの詳細は次で確認する。 ``` get_network_request(reqid: <id>) ``` ### 手順 4: Accessibility snapshotの取得 accessibility tree snapshotを取得する。 ``` take_snapshot(verbose: true) ``` **主な検出対象:** - 欠落または重複するARIA IDs - contrast ratioが不足する要素(WCAG AA: 通常テキスト4.5:1、大きなテキスト3:1) - focus trap、またはfocus indicatorの欠落 - accessible nameのないinteractive elements ## 手順 5: Codebaseの分析 **第三者siteでcodebaseへアクセスできない場合は省略する。** その場合は未実施として最終報告に明記する。 codebaseを読み、改善すべき実装箇所を特定する。 ### Framework / bundlerの検出 設定ファイルからstackを特定する。 | Tool | Config files | |------|--------------| | Webpack | `webpack.config.js`, `webpack.*.js` | | Vite | `vite.config.js`, `vite.config.ts` | | Rollup | `rollup.config.js`, `rollup.config.mjs` | | esbuild | `esbuild.config.js`, `esbuild`を使うbuild scripts | | Parcel | `.parcelrc`, `package.json`のparcel field | | Next.js | `next.config.js`, `next.config.mjs` | | Nuxt | `nuxt.config.js`, `nuxt.config.ts` | | SvelteKit | `svelte.config.js` | | Astro | `astro.config.mjs` | `package.json`のframework dependenciesとbuild scriptsも確認する。 ### Tree-shaking / dead codeの確認 - **Webpack**: `mode: 'production'`、`package.json`の`sideEffects`、`usedExports`を確認する - **Vite / Rollup**: tree-shakingは既定で有効。`treeshake` optionsを確認する - **検出対象**: barrel files(`index.js`のre-exports)、一括importされた大きなutility libraries(lodash、moment) ### Unused JS / CSSの確認 - CSS-in-JSとstatic CSS extractionの使い分けを確認する - PurgeCSS / UnCSS設定(Tailwindの`content` config)を確認する - dynamic importsとeager loadingを識別する ### Polyfillsの確認 - `@babel/preset-env` targetsと`useBuiltIns`設定を確認する - `core-js` importsのサイズを確認する - `browserslist` configが必要以上に広い環境を対象にしていないか確認する ### Compression / minificationの確認 - `terser`、`esbuild`、`swc`のminificationを確認する - build outputまたはserver configのgzip / brotli compressionを確認する - production buildのsource mapsがexternalまたはdisabledであることを確認する ## 検証と出力形式 取得したtrace / insights / network requestsとcodebaseを相互照合し、推測のみの項目は確定事実と分ける。traceが取得できない、対象URLが開けない、codebaseへアクセスできない場合は、その範囲の断定を停止して未検証と明記する。 1. **Core Web Vitals要約** - metric、実測値、rating(good / needs-improvement / poor)、閾値の確認日を表で示す 2. **優先問題** - 根拠とestimated impactを付け、high / medium / low順に示す 3. **改善案** - 対象ファイルやresource、具体的な修正、期待効果を示す。必要なcode snippet / config changeだけを添える 4. **Codebase調査** - 検出したframework / bundlerと改善箇所を示す。codebaseへアクセスできなければ「未実施」とする 5. **制約と未検証項目** - 利用できないtools、未取得のdata、追加検証に必要な操作を日本語で簡潔に示す