mcpField
F
frontend-perf

frontend-perf

github.com/fudesign2008開発645 回インストール今日更新
リポジトリ

frontend-perf について

frontend-perfは、ブラウザーやElectronの性能改善に取り組む開発者向けのリファレンススキルです。指標、ボトルネックのパターン、バージョン別の指針、最適化の優先順位をまとめ、perf-workflowと併用できます。

主な機能

  1. 01RAIL、Web Vitals、Electronの指標
  2. 02フロントエンドのボトルネックパターン
  3. 03React、Angular、Electronのバージョン別指針
  4. 04最適化項目の優先順位
  5. 05分析と検証の基準

活用シーン

  1. 01フロントエンド性能の定量的な基準設定
  2. 02リフロー、長時間タスク、メモリー増加の特定
  3. 03ReactやAngularの改善計画
  4. 04Electronの起動時間とIPC性能の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fudesign2008/open-skills --skill frontend-perf

インストール後、Claude Code で/frontend-perfを入力して読み込まれたか確認します。

同梱ファイルreference.md

詳細

フロントエンドパフォーマンス最適化ナレッジベース

perf-workflow との関係

このスキルは perf-workflow のナレッジレイヤーであり、perf-workflow はプロセスレイヤーです。両者を組み合わせて使用します。

perf-workflow のステージこのスキルが提供するフロントエンド固有の内容
ステージ 1:パフォーマンスの根拠定量的なベースライン:RAIL/Web Vitals/Electron の指標しきい値
ステージ 2:パフォーマンスの局所化フロントエンドのボトルネックパターン表、レンダリングパイプラインの局所化ルール
ステージ 3:パフォーマンスの仮説フロントエンド固有の根本原因(リフロー/長時間タスク/IPC/メモリリーク)
ステージ 4:パフォーマンスのモニタリング適用可能なツールと計測ポイント
ステージ 5:パフォーマンスの最適化最適化の優先順位の参考(P0 → P1 → P2)
ステージ 6:パフォーマンスの検証合格基準(LCP/INP/CLS/起動時間)

定量基準のクイックリファレンス

RAIL モデル(Google Chrome チーム、W3C 推奨)
フェーズ正式名称ユーザーが体感するしきい値主な最適化の方向性
R応答インタラクション → フィードバック < 100ms軽量なイベントハンドラーを使用し、メインスレッドをブロックしない
Aアニメーション安定して 60fps、フレームあたり < 16mstransform/opacity のみを使用し、リフローを回避する
Iアイドルアイドル時の作業を < 50ms のチャンクに分割するrequestIdleCallback を使って緊急性の低いタスクをスケジュールする
L読み込み最初のコンテンツ表示 < 2s、使用可能になるまで < 5sクリティカルリソースの数とサイズを減らす
Web Vitals:3 つのコア指標(2024 年版)
指標正式名称良好要改善最適化の重点
LCPLargest Contentful Paint< 2.5s> 4sファーストビューの読み込み、クリティカルレンダリングパス
INPInteraction to Next Paint< 200ms> 500msメインスレッドの長時間タスク、インタラクションの応答性
CLSCumulative Layout Shift< 0.1> 0.25レイアウトの安定性、画像サイズの事前確保
Electron デスクトップの拡張指標
指標合格しきい値(業界標準)局所化ツール
コールドスタート時間Windows < 2s、macOS < 1.5sElectron DevTools/計測タイミング
ウォームスタート時間< 500ms計測タイミング
IPC のラウンドトリップ時間呼び出しあたり < 50ms(頻繁な呼び出しの場合)IPC ログの計測
レンダラープロセスのメモリ継続的な増加がなく、ベースラインが安定Chrome DevTools の Memory パネル
メインスレッドの CPU 使用率アイドル時はほぼ 0、長時間タスクなしChrome DevTools の Performance パネル

フロントエンド固有のボトルネックパターン

perf-workflow の Stage 3 にある汎用パターン表を補足します。以下は、フロントエンドコードでよく見られる具体的な例です。

パターンフロントエンドでの具体的な現れ方よくある発生シナリオ(フロントエンド)特定ツール
リフロー(レイアウト)幾何学的プロパティの読み書きによって、描画パイプライン全体が再実行されます幅/高さ/位置の変更、offsetWidth/scrollTop の読み取り後に DOM へ書き込みPerformance パネルの Layout マーカー
再描画(ペイント)視覚的なプロパティの変更によって、Layout をスキップして再描画が発生します色/影/背景の変更Performance パネルの Paint マーカー
メインスレッドの長時間タスク50 ms を超える単一のタスクがイベントループをブロックし、INP が目標値を超えますメインスレッドでの重いデータ処理/複雑な計算/同期 IPCPerformance パネルの Long Task マーカー
不要な再レンダリングコンポーネントの props/state が変わっていないのに、再レンダリングが発生します不安定な props の参照、粒度が粗すぎるグローバル状態、過剰な context の更新React Profiler/Vue DevTools
IPC のブロッキングElectron の同期 IPC や高頻度の IPC によって、メインスレッドが飽和しますsendSync の呼び出し、スクロール/入力ハンドラー内での高頻度な IPC 送信Electron のログ+Performance パネル
メモリ使用量の継続的な増加メモリが解放されず、GC で回収できないため、最終的にジャンク/クラッシュが発生しますイベントリスナーの解除漏れ、タイマーのクリア漏れ、クロージャによる大きなオブジェクトの保持Memory パネルの Heap Snapshot
レイアウトスラッシングDOM プロパティの読み取りと書き込みを交互に行い、書き込みのたびに同期レイアウトが強制されますループ内で DOM の幾何情報を交互に読み取り/変更Performance パネルで密集した Layout マーカーを確認
React Concurrent 機能の活用不足React 18 以降のプロジェクトで、長時間の計算が引き続き同期パスで実行され、ユーザー入力への応答がブロックされますuseTransition/startTransition を使って低優先度の更新を指定していないReact DevTools Profiler のタイムライン
Angular Zone の過剰なトリガーZone.js がすべての非同期処理をインターセプトし、ツリー全体の変更検出をトリガーしますNgZone.runOutsideAngular() を使って高頻度イベントを分離していないAngular DevTools Profiler

フレームワークのバージョン別の主な最適化機能

分析/最適化の際は、まずフレームワークのバージョンを確認し、それに合った戦略を選んでください。バージョンによって戦略は大きく異なります。

React のバージョン
バージョン主なパフォーマンス機能最適化の効果
16.xPureComponent/shouldComponentUpdate/クラスコンポーネント再レンダリングを手動で制御できます。Hooks はありません
16.8+useMemo/useCallback/useRef/React.memo関数コンポーネントで細かなメモ化ができます
18Concurrent Rendering/自動バッチ処理/useTransition/useDeferredValue優先度に基づくスケジューリング、複数の setState 呼び出しの自動統合、長時間タスクの低優先度指定が可能です
19React Compiler(自動メモ化)/use()コンパイラーが参照の安定性を自動的に処理するため、ほとんどの場合、手動でメモ化を記述する必要がなくなります
Angular のバージョン
バージョン主なパフォーマンス機能最適化による効果
9+Ivy コンパイラーバンドルの縮小、コンパイルの高速化、ツリーシェイキングとの親和性向上
14+スタンドアロンコンポーネントNgModule のオーバーヘッドを削減し、より細かい単位で遅延読み込みが可能
16+Signals (signal() / computed() / effect())きめ細かなリアクティビティを実現し、Zone.js の変更検知を回避できます
17+@defer ブロック / @for ... track遅延レンダリングを標準でサポートし、trackBy をテンプレート構文に組み込み
18+Zoneless 変更検知(実験的)Zone.js のパッチを取り除き、Zone によって発生するオーバーヘッドを完全に排除
Electron のバージョン
バージョン主なパフォーマンス機能最適化による効果
12+remote モジュールが非推奨に、contextIsolation がデフォルトで有効contextBridge の使用が必須となり、remote の同期 IPC オーバーヘッドを排除
20+sandbox: true がデフォルトで有効レンダラープロセスの初期化が軽量化され、preload スクリプトの調整が必要
22+UtilityProcess APICPU 負荷の高いタスクに適した実行場所として、child_process.fork を置き換え
28+レンダラープロセスでネイティブ ESM をサポートネイティブの import() を使用でき、より徹底したツリーシェイキングが可能

ブラウザーのレンダリングパイプラインの要点

レンダリング経路:DOM → CSSOM → Style → Layout (reflow) → Paint (repaint) → Composite

操作の種類発生する最もコストの高いフェーズ代表的な CSS プロパティパフォーマンス階層
幾何学的な変更Layout (reflow)width / height / top / margin最も遅い
視覚的な変更Paint (repaint)color / background / box-shadow中程度
合成の変更Composite のみtransform / opacity最も速い

基本ルール:アニメーションとスクロールには transform / opacity のみを使用してください。それ以外のプロパティの変更はまとめて行い、最小限に抑えてください。


Electron のマルチプロセスに関する要点

プロセスの種類主な役割ブロッキングによる影響最適化のレッドライン
メインプロセスアプリのライフサイクル、ウィンドウ管理、システム APIすべてのウィンドウがフリーズまたは応答不能になる同期 IO、CPU 負荷の高いタスク、タイトなループは禁止
レンダラープロセスウィンドウ UI のレンダリング、JS の実行、ユーザー操作現在のウィンドウがフリーズするWeb フロントエンドと同じルールを適用し、同期 IPC を使用しない
GPU プロセス3D 描画、ハードウェアアクセラレーション、コンポジターレイヤーのレンダリングアニメーションのカクつき、画面のティアリングハードウェアアクセラレーションの過剰な使用を避け、コンポジターレイヤーの増えすぎを防ぐ
Worker プロセスCPU 負荷の高いタスク、ファイル IO、バックグラウンド計算UI スレッドに影響しない時間のかかるタスクはすべて、この種類のプロセスまたは Worker で実行する

基本的な IPC ルール:ipcRenderer.sendSync は絶対に使用しないでください。高頻度イベントでの IPC はスロットリングし、大きなデータのゼロコピー転送には SharedArrayBuffer を使用してください。


最適化の優先順位クイックリファレンス

時間の大部分を占めるステップを優先してください。全体の 10% 未満を占めるステップを 100 倍高速化しても、全体としての改善は限定的です(アムダールの法則)。

P0:最初に実施(効果が高く、コストが低い)
  • 長時間タスクを分割する:50ms を超える同期タスクを 50ms 未満のチャンクに分割し、requestIdleCallback でスケジュールする
  • 仮想スクロール:長いリスト(100 項目超)では必須です。react-window / vue-virtual-scroller を使用する
  • リフローを避ける:アニメーションには transform/opacity のみを使用し、DOM の読み取りをまとめてから書き込みをまとめて行う
  • 非同期 IPC:Electron の IPC をすべて非同期にし、sendSync をすべて削除する
  • Web Worker:大量データの解析、暗号化、複雑な計算をメインスレッドから移す
P1:次のステップ(コストは中程度、効果は明確)
  • コンポーネントのメモ化:React.memo / useMemo / useCallback を使用して、props と関数参照を安定させます
  • 状態の粒度:過度に大まかなグローバル状態を分割し、不要な再レンダリングの範囲を縮小します
  • コード分割:ルート単位/コンポーネント単位で動的インポートを行い、初回画面の JS サイズを縮小します
  • Electron の起動:メインプロセスのエントリーポイントを可能な限り軽量に保ち、初回画面に表示されないモジュールは非同期で読み込みます
P2:任意(エンジニアリング面での効果、長期的な取り組み)
  • キャッシュ戦略:静的アセットに長期の強力なキャッシュとハッシュ付きファイル名を使用し、Service Worker でオフラインキャッシュを行います
  • バンドルサイズの削減:ツリーシェイキングを行い、大容量ライブラリは必要に応じてインポートし、画像には WebP/AVIF を使用します
  • パフォーマンス予算と CI/CD のゲート:LCP/INP/バンドルサイズをパイプラインに組み込み、予算を超えたリリースをブロックします

詳しい実装方法については、reference.md を参照してください。


分析ツールのクイックリファレンス

シナリオ推奨ツール
メインスレッドの長時間タスクChrome DevTools → Performance パネル → Long Tasks
レンダリングのボトルネックChrome DevTools → Performance → Rendering パネル
React の再レンダリングReact DevTools Profiler(フレームグラフ+ランキングチャート)
React 18 以降のスケジューリング優先度React DevTools Profiler → タイムライン表示で Concurrent 優先度マーカーを確認
Angular の変更検知Angular DevTools → Profiler(変更検知の回数と所要時間を確認)
Angular SignalsAngular DevTools 17 以降 → Signal の依存関係グラフ表示(実験的機能)
メモリリークChrome DevTools → Memory → Heap Snapshots を比較
Web VitalsLighthouse / Chrome DevTools → Performance Insights
Electron のプロセス概要app.getAppMetrics() でプロセスごとの CPU/メモリ使用量を確認。システムリソースモニターも使用
Electron IPC のタイミングカスタムログの計測+Chrome DevTools Performance パネル
バンドルサイズの分析webpack-bundle-analyzer / vite-plugin-inspect

コメント