ブラウザの「インクリメンタルパース」を知れば、パフォーマンスチューニングはもっと面白くなる
現場で「なぜかLCP(Largest Contentful Paint)が悪いんだよね」なんて頭を抱えることはないだろうか? 多くのエンジニアは「画像が重いから」「JSがブロッキングしているから」と、表面的な原因に目を向けがちだ。
だが、ブラウザがHTMLという「ただの文字列の羅列」を、どうやって魔法のように画面上のピクセルに変換しているか。その深淵なるプロセス――特に「インクリメンタルパース(逐次解析)」の挙動を理解すると、最適化の引き出しが一段階上のレベルへ引き上げられる。
今日は、ブラウザが裏側で汗をかきながらどうHTMLを読み解いているのか、その「泥臭い現実」と実務での活かし方を共有しよう。
—
ブラウザは「全部読み終わるのを待たない」
想像してみてほしい。巨大なHTMLファイルをダウンロードし終えるまで画面に何も表示されなかったら、ユーザーは0.5秒で離脱するだろう。
ブラウザのレンダリングエンジン(BlinkやWebKit)は極めて賢い。ネットワーク越しに送られてくるHTMLデータを、「チャンク(断片)」として受け取ったその瞬間からパースを開始する。これがインクリメンタルパースだ。
1. トークナイザーの躍動: ネットワークから届いたバイト列を文字に変換し、HTMLのタグや属性という「トークン」に切り出す。
2. DOM構築の開始: トークンが生成されるたびに、即座にDOMツリーにノードが追加される。
3. スタイルとレイアウト: DOMの一部ができあがれば、CSSOMと組み合わせてCSSの計算を行い、レイアウト(配置)を確定させ、ペイント(描画)へ回す。
つまり、HTMLの末尾が届く前に、ブラウザはすでに画面の半分を描画し始めているんだ。この連続的な処理こそが、Webの高速性を支える屋台骨だと言える。
—
この仕組みをハックする:スクリプトとブロッキングの罠
この「逐次処理」の流れを止めてしまう最大の要因が、ご存知の通り `