やあ。今日も元気にコード書いてるかい?
フロントエンド開発をやっていると、一度は「なぜか画面の表示が妙に遅い」「JavaScriptのせいでレンダリングがブロックされている気がする」という壁にぶ当たるよな。特に、ユーザーが最初に目にするファーストビューの表示速度(Core Web VitalsのLCPなど)をシビアにチューニングしなきゃいけない現場では、ブラウザの「中身」を理解しているかどうかが、プロとアマの分かれ道になる。
今回は、Webブラウザの心臓部の一つである「パーサーブロッキング(Parser Blocking)」、そしてそれを華麗にいなすための`defer`と`async`属性の正しい使い分けについて、ブラウザの裏側の動きを覗き見ながら徹底的に解説しようか。
中級からワンランク上のシニアへステップアップしたい君なら、知っておいて損はないどころか、明日からのコードの書き方がガラリと変わるはずだ。さあ、いってみよう。
—
1. ブラウザはなぜ `` で足を止めるのか?
まず、ブラウザがHTMLをどうやって画面上のピクセルに変換しているか、その大まかな流れを思い出してくれ。
1. HTMLパース: サーバーから送られてきたバイト列を文字コードに変換し、トークン化してDOMツリーを構築する。 2. CSSOM構築: CSSを見つけたら、同様にパースしてスタイル情報をまとめたCSSOMツリーを構築する。 3. レンダリングツリー構築: DOMとCSSOMを合体させて、画面に何を表示するかを決めるツリーを作る。 4. レイアウトとペイント: 各要素の位置を計算し(レイアウト)、実際に画面を描画する(ペイント)。
ここで問題になるのが、HTMLをパースしている最中にインライン、あるいは外部読み込みの `
ブラウザの仕組みを極める
ここにコンテンツが続きます...