メインコンテンツへスキップ

Insight / 速くて快適なサイト

INP を 200ms 未満にする実装の全手法

読了目安 9 分

この記事の結論

INP(Interaction to Next Paint)は、ユーザーの操作に対してサイトが 200 ミリ秒以内に応答できているかを測る指標です。悪化の主因は、メインスレッドを長時間ふさぐロングタスク(50ms 超の処理)。改善の核心は「長い処理を細かく分割し、こまめにブラウザへ制御を返す(yield する)」こと。scheduler.yield() や Web Worker を使い、重い計算を画面更新の邪魔をしない場所へ追い出せば、200ms 未満は十分に届きます。

INP = 操作してから画面が更新されるまでの時間 タップ・クリック・キー入力 → 次の描画 までの全体を測る 入力遅延 処理待ち 処理時間 JavaScript の実行 描画遅延 画面の再描画 この合計 ≦ 200ms で「良好」 〜200ms 良好 200〜500ms 要改善 500ms〜 不良
図 1:INP は入力遅延・処理時間・描画遅延の合計。200ms 以内が良好の境界線。

1. INP とは何を測っているのか

INP(Interaction to Next Paint)は、ユーザーがボタンをタップしたり文字を入力したりした瞬間から、その操作の結果が画面に反映されるまでの時間を測る指標です。Core Web Vitals の 3 指標のうち「操作への応答性」を担当します。

合格基準は明確で、200 ミリ秒以内なら「良好」、200〜500ms で「要改善」、500ms 超で「不良」です。判定は実ユーザーの体験データ(CrUX)の 75 パーセンタイルで行われるため、回線が遅い人や古い端末の人を含めて 200ms 以内に収める必要があります。

2024 年 3 月、INP は旧指標 FID(First Input Delay)と置き換わりました。FID は最初の 1 操作の「待ち時間」だけを見ていましたが、INP はページ滞在中のほぼ全操作を見て、応答が完了し画面が更新されるまでを測ります。FID より格段に厳しい指標です。

2. 悪化の正体は「ロングタスク」

ブラウザの JavaScript は「メインスレッド」という 1 本の作業列で動きます。ここで 50 ミリ秒を超える処理が走っている間、ブラウザはユーザーの操作に応答できません。これが「ロングタスク」で、INP 悪化の正体です。

Web Almanac 2025 によると、INP 自体は改善傾向にある一方、TBT(Total Blocking Time=メインスレッドがふさがる総量)は前年比 58% 増。サイトに積まれる JavaScript の総量と実行コストが増え続けていることを示しています。

タップしても反応しない、入力した文字がワンテンポ遅れて表示される — こうした「もたつき」は、たいてい裏でロングタスクが走っているサインです。解決の方向はひとつ。長い処理を細かく区切り、その合間にブラウザへ制御を返すことです。

ロングタスク分割で操作に応答できるようになる 改善前:ひとつの長い処理がメインスレッドを占有 長い処理(この間ずっと操作できない) → 応答が遅い 改善後:処理を分割し、合間に制御を返す(yield) → 操作に即応答 緑の隙間でブラウザがユーザー操作を処理できる
図 2:長い処理を分割し合間に制御を返すと、その隙間でブラウザが操作に応答できる。

3. 中核手法 — タスクを分割して yield する

INP 改善の中核は、web.dev 公式が示す「ロングタスクの分割」と「メインスレッドへの yield(明け渡し)」です。処理の途中でブラウザに「ここで一旦どうぞ」と制御を返すと、その瞬間に溜まっていたユーザー操作を先に処理できます。

制御を返す新しい標準が scheduler.yield() です。ただし 2026 年 5 月時点で Safari は未対応のため、使える環境では scheduler.yield()、使えない環境では setTimeout によるフォールバックを併用するのが定石です。タスクに優先度を付けて予約する scheduler.postTask() も関連 API として使えます。

実装の勘所は、ループや一括処理の中で「重要な画面更新を先に済ませ、残りの作業の前に yield する」こと。イベントハンドラの中に重い処理を全部書かず、ユーザーに見える部分の更新を優先させます。

yield のフォールバック実装パターン function yieldToMain() { if ('scheduler' in window) return scheduler.yield(); ← 新標準 return new Promise(r => setTimeout(r, 0)); ← Safari 等の保険 } 重い処理の合間で await yieldToMain() を呼べば、操作に割り込みの余地が生まれる
図 3:scheduler.yield() を主に、setTimeout を保険にしたフォールバック構造。

4. 重い計算は Web Worker へ逃がす

分割しても重すぎる処理は、そもそもメインスレッドから外すのが正解です。それを担うのが Web Worker。画面描画とは別のスレッドで JavaScript を動かせる仕組みです。

大量データの並べ替え、検索フィルタの集計、画像の前処理といった「画面を直接いじらない計算」は Web Worker に任せられます。計算が終わったら結果だけをメインスレッドに渡して描画する。こうすればメインスレッドは常に操作へ応答できる状態を保てます。

中小企業サイトでここまで必要になる場面は多くありませんが、商品の絞り込み一覧や予約カレンダーなど「操作のたびに裏で計算が走る」画面では効果が大きい手法です。

5. 公式ケーススタディが示す改善幅

「INP を直すと何が変わるのか」は、web.dev の公式ケーススタディが具体的に示しています。いずれも前述の手法を実際に適用した結果です。

EC サイトの Trendyol は scheduler.yield() の導入で商品一覧の INP を 50% 削減。不動産サイトの QuintoAndar は INP を 80% 削減し、コンバージョンが前年比 36% 増と報告されています。ニュースサイトの Economic Times は INP を約 4 分の 1 にし、直帰率 50% 減・ページビュー 43% 増という結果が出ています。

誠実にお伝えすると、「INP 改善 → 売上 X%」は厳密には因果ではなく相関です。それでも、操作の快適さがビジネス指標と一緒に動く事例が公式に積み重なっていることは、対策の価値を裏付けています。

web.dev 公式ケーススタディの INP 改善幅 Trendyol(EC) -50% 商品一覧の INP QuintoAndar(不動産) -80% CV 前年比 +36% 報告 Economic Times(報道) 約 1/4 に 直帰率 -50% 報告 ※ ビジネス指標の変化は相関。「〜という結果が報告されている」事例。
図 4:公式ケーススタディが示す INP 改善幅。手法は本記事と同じ。

6. 【Top 6】INP を 200ms 未満にする実装手順

優先度の高い順に、実際の作業手順としてまとめます。上から取り組むのが効率的です。

  1. まず計測して遅い操作を特定する — Chrome DevTools の Performance パネルや PageSpeed Insights で、どの操作で INP が伸びているかを実データで確認する。

  2. 50ms 超のロングタスクを洗い出す — DevTools で長い処理に色が付く。イベントハンドラ内で何が走っているかを 1 つずつ確認する。

  3. 長い処理を分割し yield を挟むscheduler.yield() を主に、setTimeout をフォールバックにして、処理の合間に制御を返す。

  4. 画面に見える更新を優先する — クリック直後に「押された見た目」だけ先に反映し、重い処理は後回しにする。体感の応答性が大きく変わる。

  5. 重い計算は Web Worker へ逃がす — 並べ替え・集計など画面を触らない計算は別スレッドへ。メインスレッドを操作応答に専念させる。

  6. 不要な JavaScript を減らす — 使っていないライブラリやタグを外す。そもそもの処理量が減れば、ロングタスクは生まれにくくなる。

INP は「測れば直せる」指標です。もたつきの正体はほぼ必ずロングタスクであり、分割と yield、Web Worker への退避で着実に縮みます。T.C.HARTON は全ページの Core Web Vitals 実測を 方法論ページで公開しています。まずは現状の INP を数字で知ることが第一歩です。

よくある質問

INP と旧指標 FID は何が違いますか?
FID は最初の 1 操作の「待ち時間」だけを測る指標でしたが、INP はページ滞在中のほぼ全ての操作を見て、その中で遅かったものを代表値として採用します。応答が完了して画面が更新されるまでを測るため、FID より格段に厳しい指標です。2024 年 3 月に Core Web Vitals の正式指標として FID と置き換わりました。
INP の合格基準は何ミリ秒ですか?
INP は 200 ミリ秒以内であれば「良好」、200〜500 ミリ秒で「要改善」、500 ミリ秒超で「不良」とされます。判定は実ユーザーの体験データ(CrUX)の 75 パーセンタイルで行われるため、回線が遅い人や古い端末の人を含めて 200ms 以内に収める必要があります。
scheduler.yield() はすべてのブラウザで使えますか?
scheduler.yield() はメインスレッドを安全に明け渡す新しい標準 API ですが、2026 年 5 月時点で Safari は未対応です。そのため scheduler.yield() が使える環境ではそれを使い、使えない環境では setTimeout によるフォールバックを併用するのが定石です。
INP を良くすると売上も上がりますか?
web.dev の公式ケーススタディでは、INP を約 80% 削減した QuintoAndar でコンバージョンが前年比 36% 増、INP を約 4 分の 1 にした Economic Times で直帰率 50% 減・ページビュー 43% 増という結果が報告されています。厳密には相関ですが、操作の快適さがビジネス指標と結びつく事例として参考になります。

関連記事

出典

Free Diagnosis

あなたのサイトの操作は、もたついていませんか

無料診断では、現状サイトの INP を含む Core Web Vitals を実測し、もたつきの原因をお見せします。発注前に「成功の基準」を一緒に決めます。診断だけで終わっても費用は一切かかりません。

1 分で無料診断を申し込む