やあ、調子はどうだい?
今日もどこかのコードレビューで「なんでこの画像、読み込みが遅いんだよ……」なんて頭を抱えていたところじゃないか?
フロントエンドのパフォーマンスチューニングを語るとき、私たちはついつい「JavaScriptのバンドルサイズを削れ」とか「CSSのセレクタを最適化しろ」といった、目に見えるメインスレッドの作業にばかり気を取られがちだ。しかし、ブラウザが画面を表示するまでの「裏側のメカニズム」を深く知らなければ、真の高速化は成し得ない。
今回は、そんなブラウザの裏側でいぶし銀の働きを見せる「プリロードスキャナ(Preload Scanner)」について、徹底的に深掘りしていこう。これがどう動いているかを理解すれば、君の書くマークアップのクオリティは一段も二段も跳ね上がるはずだ。心して聞いてくれ。
—
1. そもそも、なぜ「プリロードスキャナ」が必要なのか?
まず、ブラウザがHTMLを受け取ってから画面を描画するまでの基本的なフローを思い出してほしい。
ネットワーク経由でHTMLのバイト列が流れてくると、ブラウザはそれをパース(解析)し、上から順にDOM(Document Object Model)ツリーを構築していく。
ここで厄介な問題が起きる。
HTMLパーサーが途中で `` のような外部スクリプトタグに出会ったとき、何が起こるだろう?
そう、「パーサーブロッキング(Parser Blocking)」だ。
セキュリティやDOM構造の整合性を担保するため、ブラウザは「このJavaScriptが実行されることでDOMが書き換わるかもしれない」と予測し、HTMLのパースを一時停止する。さらに、そのスクリプトのダウンロードと実行が完了するまで、次のHTMLの解析には進めない。
メインパーサーの限界と、裏で走る救世主
さて、ここで想像してほしい。もしHTMLの途中に重いJavaScriptがあったら? メインのHTMLパーサーはそこで完全にフリーズしてしまう。
昔のブラウザ(本当に初期の頃)は、メインパーサーがスクリプトの読み込みと実行で止まっている間、次のリソース(画像やCSS、他のJSなど)を見つけることができなかった。つまり、ネットワーク帯域がガッツリ空いているにもかかわらず、ブラウザは指をくわえて突っ立っていたわけだ。これじゃあパフォーマンスが悪くて話にならない。
そこで現代のブラウザに搭載されたのが、「プリロードスキャナ(Preload Scanner)」だ。
プリロードスキャナは、メインのHTMLパーサーとは独立して、「先読み専用の軽量なもう一人のパーサー」として裏でこっそり動いている。メインパーサーがスクリプトで足止めを食らっているまさにその瞬間も、プリロードスキャナは猛烈なスピードでHTMLの先をスキャンし、``、``、 `

ブラウザの裏側を知る者だけが勝つ
プリロードスキャナは、君のマークアップをいつも見守っている。