STATUS IS UPウェブサイト最適化ウィキ
25高速化
パフォーマンスと配信 / 高速化

JavaScript パフォーマンス: メインスレッドの作業を減らす

ページの反応を鈍らせたり、遅延させたり、不要な作業を発生させたりする JavaScript を特定し、削除または延期して、ユーザー操作を保護します。

JavaScript パフォーマンス: メインスレッドの作業を減らす — ビジュアルガイド
読む
8 分
出典
5
再検証
2027-03-27
レビュー済み
シニアWebパフォーマンスレビュアー
短い答え

まず決断から始める。

実際のページと操作を計測してメインスレッドの作業を減らし、最も大きく繰り返し発生するコストを修正します。メインスレッドは、ほとんどのページ JavaScript とユーザーインターフェースの処理を一度に1つのタスクずつ実行します。50 ミリ秒を超えるタスクは長時間タスク(long task)と見なされ、タップ、クリック、スクロール、ペイントなどの処理が完了まで待たされる可能性があります。チェックアウト、検索、ナビゲーション、フォーム送信など、影響が大きいジャーニーから始めてください。

各コストについては、取り除く、必要になるまで遅らせる、短いバッチに分割する、または範囲を限定した計算処理を Web Worker に移すといった対応を検討します。即時の応答はメインスレッド上で維持し、分析や非必須の後続処理は後回しにします。サードパーティのタグはすべて、担当者を明確にした依存関係として扱ってください。制約のあるモバイル CPU で再テストし、重要なフローについてはロールバック手順を用意しておきます。Status Is UP の方針に従い、ユーザーの利用フローが停止する前に劣化を防ぎ、安全に対処できるようにします。

ビジュアルガイド

作業をシステムとして見る。

個別の戦術に取り掛かる前に、この記事の意思決定をこのマップで結び付けてください。

SIU高速化
01まず顧客ジャーニーをプロファイルしてからコードを変える
02トレースを作業のキューとして読む
03重要なタイミングではコードを減らして出荷する
04ブラウザが応答できるように作業を分割する
01

まず顧客ジャーニーをプロファイルしてからコードを変える

ナビゲーションを開く、結果を絞り込む、フォームを送信するなど、重要なルートと操作を1つ選択します。Chrome DevTools の Performance パネルでクリーンなブラウザ状態から記録してください。アクションを繰り返し、スロットルした CPU の実行と開発機の実行の両方をキャプチャします。デスクトップのトレースは低スペックの電話上で問題を隠すことがあります。

トレースは、バンドルレポートだけを根拠にコンポーネントを決めつけるためではなく、狭い仮説を検証するために使います。Main flame chart では幅の広いバーが処理時間が長いことを示し、積み重なったバーはコールスタックを表します。タスク上の赤い三角は潜在的な長時間タスクを示します。タスクを選択し、発端となったコードへのリンクをたどってください。意味のある変更に備えて、ビフォーアフタートレースを保存します。

瞬間をキャプチャする

アクションの直前から記録を開始し、表示される結果の後で停止します。

再現可能なケースを使う

ルート、アカウント状態、操作の順序を一貫させます。

オーナーを名付ける

各トップコストを変更できるチームまたはベンダに割り当てます。

02

トレースを作業のキューとして読む

長時間タスクは調査のしきい値であって、完全な診断ではありません。W3C の Long Tasks 仕様は 50 ミリ秒以上のタスクを報告します。タスクの内訳を確認し、JavaScript の評価、イベントハンドラ、スタイル再計算、レイアウト、ペイントなどを探してください。コールスタックはどこから手を付けるべきかを示し、タイミングは問題がコード、レンダリング、またはサードパーティに起因するものかを示します。

価値のある操作中に繰り返し発生するコストを優先してください。短いハンドラでも、レイアウトを引き起こしたり前の作業の後ろで待たされたりすると遅く感じられます。トレースはラボ計測なので、代表的なデバイスと、利用可能ならプライバシーに配慮したフィールド計測で修正を確認してください。

瞬間を分ける

起動時の解析とタップ後のハンドラでは別の対策が必要です。

レンダリングを点検する

リファクタ前に繰り返し発生する style-write / layout-read のパターンを見つけます。

ベースラインを保持する

トレース、シナリオ、上位コストを作業項目に添付します。

03

重要なタイミングではコードを減らして出荷する

ルートと用途ごとにスクリプトの在庫を作ります。未使用のパッケージ、重複、終了した実験、終わった機能用のコードを削除します。続いてルート固有やまれに使われる機能を分割し、初期パスではなく必要時に読み込むようにします。動的読み込みは起動時の作業を減らせますが、ユーザーが機能を即時に必要とする場合は目に見える遅延を生むことがあります。

コンポーネントにフル機能のクライアントサイドフレームワークが本当に必要か、ユーティリティが既存の機能と重複していないか、静的 HTML に小さな拡張を加えるだけで十分ではないかを検討してください。遅延読み込みするモジュールのフォールバック状態をテストしてください。ページでは、任意の機能を適切に遅延させ、代わりに機能しないコントロールを表示しないようにすべきです。

ルート予算を作る

どのルートでどのスクリプトを許容するか、理由を文書化します。

意図で読み込む

オプションのエディタ、地図、プレーヤー、レポートビューなどに検討します。

重要パスを保護する

認証、アクセシビリティ、支払い、フォーム完了をテストし、コントロールに影響がある場合は資格のあるレビューを求めます。

04

ブラウザが応答できるように作業を分割する

小さな関数に名前を付けても、それらが同期的に実行されればブラウザの別タスクにはなりません。長いループの場合は作業をバッチ化し、ユーザーに即時表示される状態を更新してから続行前に一度割り込み(yield)を入れてください。これによりバッチ間でブラウザが入力やレンダリングを処理できます。

サポートされている場合は scheduler.yield() がメインスレッドに譲り、後で作業を継続できます。未対応ブラウザ用に機能検出とフォールバックを用意してください。すべての小操作後に常に yield するのは避けてください。オーバーヘッドが発生し、完了時間が長くなることがあります。境界は計測に基づいて選び、キャンセルを保持し、古い結果が新しい状態を置き換えないようにします。

UI を優先する

視認できる受け入れや進捗を非表示のフォローアップより先に表示します。

経過時間でバッチ化する

アイテムごとではなく、計測で長時間になる前に yield します。

時代遅れの近道を避ける

現在の web.dev のガイダンスは isInputPending() に基づく新しい戦略を推奨していません。

05

インターフェースではなく計算をワーカーに移す

Web Worker はメイン実行スレッドとは別のバックグラウンドスレッドでスクリプトを実行します。高負荷なパース、データ変換、検索インデックス化など、DOM に直接アクセスする必要がない重い計算に適しています。定義された入力を送り、定義された結果を返し、描画と可視状態の変更はメインスレッド上に残します。

ワーカーは万能ではありません。DOM を直接操作できず Window を使えず、一般的なメッセージ通信はデータをコピーします。ワーカーの生成、データ移動、エラー調整は小さな計算ではコストが上回ることがあります。対話全体を計測し、不要なワーカーは終了させ、ワーカーが失敗した場合のフォールバックを設計してください。

独立した作業を選ぶ

入力と出力が直列化(シリアライズ)できてテスト可能な計算から始めます。

メッセージにバージョンを付ける

古いフィルタ、ルート、または操作向けに作られた結果は破棄します。

アクセシビリティを維持する

通常のインターフェースを通じて意味のある進捗を伝えます。

06

サードパーティの JavaScript を本番環境の依存関係として管理する

分析、広告、実験、ソーシャル埋め込み、ビデオプレーヤー、サポートウィジェットは、リクエスト、JavaScript 評価、iframe、依存関係を追加します。ベンダのスクリプトは必要かもしれませんがアプリケーションチームの直接管理外にあり、パフォーマンス、プライバシー、セキュリティ、継続性に影響を与えます。目的、ルート、読み込み条件、承認者、同意の要否、削除の責任者を在庫化してください。

条件と契約が許す場合は、代表的なページをサードパーティ起点を含む場合と含めない場合で比較してください。パフォーマンスツールは高コストの評価、ペイロード、長時間タスクの帰属を明らかにできます。文書化された価値が計測されたコストを正当化する場合にのみ、軽量または遅延統合を維持します。オプション依存が遅いか存在しない場合は、コアコンテンツと主要なトランザクションが動くことを確認してください。

影響範囲を限定する

タグは必要なルートと条件でのみ読み込むようにします。

変更管理を見直す

タグマネージャーの変更にはパフォーマンス、プライバシー、セキュリティ、ロールバックのレビューを含めます。

削除スイッチを用意する

非重要な統合を無効にする方法を文書化しテストします。

07

応答性をリリースの安全装置にする

成果が出たトレースを、重要なジャーニー向けの小規模な回帰チェックに転用します。対象の操作、デバイスまたは CPU の制約、期待する応答、レビュー担当者を定義してください。これをバンドルおよびサードパーティのインベントリレビューと組み合わせ、新しいパッケージやタグがメインスレッドの作業を気付かないうちに再導入しないようにします。

Status Is UP はこれらの証拠を積極的な最適化と安全な是正に使いますが、ライブ可用性監視に代わるものではありません。ハイリスクの変更前にはロールバックを準備し、リリース後に重要フローを検証してください。結果はデバイス、ネットワーク、ブラウザ、コンテンツ、アカウント状態で変わるため、閾値は保証ではなくガードレールとして扱ってください。

大きな変更をゲートする

共有ナビゲーション、チェックアウト、検索、または大規模バンドルについてはビフォーアフタートレースを求めます。

ロールバックを練習する

既知の良好な動作を復元する機能フラグ、タグ設定、またはデプロイバージョンを把握しておきます。

定期的に見直す

主要リリース、ベンダ変更、デバイス構成の変化後に再プロファイルします。

実行 / 検証

実践的なTo‑Doガイド。

  1. 01

    重要な操作を選ぶ

    ルート、操作、期待応答、顧客への影響を明記します。

    検証: テストノートにルート、アカウント状態、操作、ブラウザ、デバイスまたは CPU 設定が記録されています。
  2. 02

    ベースラインを記録する

    クリーンな状態から DevTools Performance で操作を記録します。

    検証: チームが Main flame chart を使ってトレースを再確認できます。
  3. 03

    ブロッキング作業を見つける

    長時間タスク、コールスタック、レンダリング、サードパーティの活動を検査します。

    検証: 各上位コストに期間、ソースまたは起点、ルート、オーナーが付与されています。
  4. 04

    不要なスクリプトを削除する

    未使用パッケージ、終了した実験、重複、不要なルートコードを削除します。

    検証: 削除後にビルドと重要ジャーニーが動作します。
  5. 05

    オプション機能を遅延させる

    遅延状態でも可用なときのみオプション機能を後で読み込みます。

    検証: 新規ページテストで読み込み、失敗、またはフォールバックをカバーします。
  6. 06

    長時間タスクを分割する

    作業をバッチ化し、即時のインターフェース応答の後に yield します。

    検証: 新しいトレースで同等のインタラクション経路の長時間タスクが消え、結果が正しく保持されます。
  7. 07

    ワーカーを評価する

    入力と出力が明確に定義された、範囲の限定された計算だけをワーカーに移します。

    検証: エンドツーエンドのタイミング、エラー、古い結果、クリーンアップをテストします。
  8. 08

    サードパーティを監査する

    目的、オーナー、条件、同意、コスト、無効化手順を記録します。

    検証: すべての重要ルートタグに保持、制限、遅延、または削除の決定があること。
  9. 09

    制約条件でテストする

    可能な範囲でスロットルした CPU と代表的なブラウザやデバイスで繰り返します。

    検証: 比較が同じシナリオを使い、重要な差異を記録しています。
  10. 10

    ロールバック付きでリリースする

    トレース、受け入れチェック、復元手順をリリースに添付します。

    検証: 指名された担当者が、文書化されていない情報を探し回ることなく、既知の良好な動作を復元できる。
議論のテーマ

トレードオフを比較し、非公開データは共有しないでください。

これらのプロンプトをチームやサイトオーナーコミュニティで使ってください。手法や学びは共有して構いませんが、認証情報や顧客データ、非公開インフラの詳細を貼り付けないでください。

  1. 01

    読み込みレポート上は許容範囲に見えたが、実際のタップやクリックをプロファイルしたら遅いと分かった操作はどれですか?

  2. 02

    サードパーティ機能が測定されたメインスレッドのコストを正当化するかどうかはどのように判断しますか?

  3. 03

    重要なジャーニーを中断せずにパフォーマンス回帰を元に戻す際、どのロールバック機構が最も簡単ですか?

人気/信頼できる資料

出典資料を開く。

web.devOptimize long tasks ↗

長時間タスク、yield、scheduler.yield()、フォールバック、および yield のオーバーヘッドについて説明します。

レビュー日 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

記録、フレームチャート分析、長時間タスクの特定、ソース調査の方法を示します。

レビュー日 2026-09-27
MDN Web DocsWeb Workers API ↗

ワーカー、メッセージ通信、および DOM 直接操作の制限を定義します。

レビュー日 2026-09-27
web.devLoad Third-Party JavaScript ↗

サードパーティスクリプトの監査と計測のガイダンスを提供します。

レビュー日 2026-09-27
W3CLong Tasks API ↗

長時間タスク、閾値、および帰属の定義を提供します。

レビュー日 2026-09-27

出典ポリシー この記事は編集チームが参照した公式ブラウザ、標準、および web-platform ドキュメントを使用しています。計測と保証を区別し、裏付けのない主張は省略しています。

簡単な補足

よくある質問

長い JavaScript タスクとは何ですか?

W3C の Long Tasks 仕様では 50 ミリ秒以上のタスクを報告閾値として使用します。これは調査の合図であり、より短いタスクが無害であることの証明ではありません。トレースで原因を確認してください。

コード分割は常に JavaScript パフォーマンスを向上させますか?

いいえ。分割は起動時の作業を減らせますが、初回利用時の遅延を増やすことがあります。ルート固有またはオプションのコードに対して使い、制約条件下でその機能をテストしてください。

すべての高コスト関数を Web Worker で実行すべきですか?

いいえ。ワーカーは入力と出力が定義された直列化可能な重い計算に適しています。ワーカーは DOM を直接変更できず、データ転送に時間がかかり、小さなタスクはメインスレッドの方が速く終わることがあります。

Status Is UP Editorial Team · 可用性向上支援編集チーム

レビュー: シニアWebパフォーマンスレビュアー。公開 2026-09-27、更新 2026-09-30。