おい、調子はどうだ?
日々、Reactのコンポーネント設計や、Tailwind CSSのユーティリティクラスの嵐と格闘ご苦労様。フロントエンドエンジニアとして中級からもう一段上のレイヤーへ突き抜けたいなら、「ブラウザが画面を光らせるまでの裏側の泥臭いストーリー」を解像度高く理解しておく必要がある。
今回は、ブラウザのレンダリングパイプラインの心臓部、「CSSOM(CSS Object Model)ツリーの構築プロセス」について話をしよう。
DOMについては「HTMLをパースしてツリー構造を作るやつね」と即答できる連中も、CSSOMの話になると途端に口が重くなる。だがな、ここを正確に把握していないと、知らず知らずのうちに重くてモッサリしたクソアプリを作り上げてしまう原因になるんだ。
さあ、ブラウザの内部で今まさに何が起きているのか、一緒に覗いてみようか。
—
1. DOMとCSSOMの決定的な違いと、ブラウザの「焦り」
まず大前提として、ブラウザがHTMLを読み込んでDOM(Document Object Model)を構築するプロセスと、CSSを読み込んでCSSOMを構築するプロセスは、基本的には別軸で走る。
DOMはHTMLタグの入れ子構造をそのまま素直にツリー化したものだ。一方、CSSOMは、CSSのルール(セレクタと宣言)を解析し、どの要素にどのスタイルが適用されるのかという「カスケード(継承と詳細度)」の計算結果を含んだ階層構造になる。
ここで一つ、現場でよくある誤解を解いておこう。
「HTMLのパース中にCSSが出てきたら、CSSOMができるまでDOM構築は完全にストップするんでしょ?」
半分正解で、半分は不正解だ。厳密に言うと、CSSは「レンダーブロッキング(描画ブロック)リソース」と呼ばれる。ブラウザは、安全かつ正確な初期表示を行うために、CSSOMが完成するまで画面の描画(レンダリング)を意図的に待たせる。
なぜなら、もしCSSOMなしでDOMだけで描画してしまうと、画面が表示された瞬間にスタイルが当たってガタガタとレイアウトが崩れる(FOUC: Flash of Unstyled Content)という、ユーザーにとって最悪の体験を生むからだ。ブラウザのエンジニアたちは、ユーザーをそんな不快な目に合わせないために、裏側で必死に耐えているのさ。
—
2. CSSOM構築の裏側:バイトからツリーへ
ブラウザがCSSファイル(あるいは`
爆速レンダリングへようこそ
ブラウザの裏側を理解したフロントエンドエンジニアのコードは美しい。