7つの隠れたJavaScriptのボトルネックとその解決策

Webアプリの動作が遅い原因が、アルゴリズムの不備であることは稀です。実際には、コードとブラウザのやり取りの仕方に問題があるのです。

私は300件のプロダクション環境のアプリケーションをプロファイリングしました。パフォーマンス問題の73%は、以下の7つの原因から発生しています。

  1. レイアウト・スラッシング (Layout thrashing) プロパティの読み取り、DOMへの書き込み、そして再び読み取りを行うことで発生します。これにより、ブラウザはレイアウトの再計算を繰り返し強制されます。
  1. 解除されないイベントリスナー (Unbounded event listeners) イベントリスナーを追加したまま削除しないと、メモリリークが発生します。これはシングルページアプリケーション(SPA)における大きな問題です。
  1. ループ内での同期的なDOM読み取り (Synchronous DOM reads in loops) ループ内で offsetWidthgetBoundingClientRect を読み取ると、絶え間ないリフロー(reflow)が発生します。
  1. requestAnimationFrame によるバッチ処理の欠如 (Missing requestAnimationFrame batching) スクロールやリサイズイベント時に直接DOMを変更すると、実行頻度が高すぎることになり、カクつき(jank)の原因となります。
  1. 巨大な JSON.parse ペイロード (Large JSON.parse payloads) 大きなファイルをパースするとメインスレッドがブロックされます。これが入力遅延(input lag)を引き起こします。
  1. 複雑なCSSセレクターのマッチング (Complex CSS selector matching) 深くネストされたセレクターや複雑なセレクターは、スタイルの再計算を遅らせます。
  1. 重複するバンドルチャンク (Duplicate bundle chunks) 最適化されていない巨大なバンドルは、転送時間の無駄を生みます。

進捗を測定する方法:

これらの領域を改善することで、Core Web Vitals、特に Largest Contentful Paint と Interaction to Next Paint が向上します。

出典: https://dev.to/kui_luo/how-to-find-and-fix-7-hidden-performance-bottlenecks-in-your-javascript-code-ek5