🔍 inp.works

重いイベントハンドラー:クリックに500msかかる理由と直し方

何が起きているか

ユーザーがクリックすると、ブラウザは次のフレームを描画する前にイベントハンドラーを最後まで実行します。ハンドラーが数百msの同期処理 — 大きな配列のフィルタ、DOMの構築、JSONの解析 — を行うと、ページはちょうどその間フリーズします。ハンドラーが戻るまでユーザーには何も起きていないように見えます。

これはINPで最も多い問題で、INPの内訳では長いprocessing timeのフェーズとして現れます。

見分け方

直し方

問題

button.addEventListener("click", () => {
  const results = filterRows(allRows)   // 400 ms of sync work
  renderTable(results)                  // user saw nothing until now
})

修正

button.addEventListener("click", async () => {
  button.classList.add("loading")       // instant feedback, painted first
  await scheduler.yield()               // let the browser paint
  const results = filterRows(allRows)
  renderTable(results)
  button.classList.remove("loading")
})
サイトを無料でスキャン →
Advertise here