【実務・中級編】 レンダーツリーの構築 – Webブラウザの仕組み実践ガイド

お疲れ様!日々のフロントエンド開発、楽しんでいるかな?

VueやReact、Next.jsといったモダンなフレームワークを使っていると、私たちは「状態(State)」を更新するだけで、画面が魔法のように書き換わる恩恵に預かることができる。だけど、その「魔法」の裏側で、ブラウザがどれほど泥臭く、そして極限まで洗練された処理を行っているか、意識したことはあるかい?

今回は、ブラウザレンダリングの心臓部でありながら、意外とブラックボックスになりがちな「レンダーツリー(Render Tree)の構築」にスポットを当ててみよう。

「DOMとCSSOMが合体するんでしょ?」という教科書通りの知識から一歩踏み込んで、「なぜ `display: none` と `visibility: hidden` でブラウザの挙動が劇的に変わるのか」「どうして疑似要素(`::before`)は画面に映るのか」といった、実務のパフォーマンスチューニングに直結するディープな領域まで、ブラウザエンジンの気持ちになって解説するよ。

さあ、温かいコーヒーでも飲みながら、ブラウザの裏側を一緒に覗いてみよう!

—

1. レンダーツリー構築とは:DOMとCSSOMの「お見合い」

ブラウザがHTMLを解析して作った DOM(Document Object Model) と、CSSを解析して作った CSSOM(CSS Object Model)。これらは、作られた時点ではまだ「お互いの存在を知らない」独立したツリー構造なんだ。

この2つをガッチャンコして、「実際に画面に描画する必要がある要素だけ」を集めた第3のツリーを作るプロセス、これこそがレンダーツリーの構築(Attachment / アタッチメント)だ。

[ HTML ] —> DOM Tree ──┐
├─ (Attachment) ─> [ Render Tree ] ─> Layout ─> Paint
[ CSS ] —> CSSOM Tree ─┘

ブラウザ(例えばChromeのレンダリングエンジン「Blink」や、Safariの「WebKit」)は、DOMツリーのルート(根っこ)から1ノードずつトラバース(走査)していき、対応するCSSOMのスタイルルールをマッチングさせていく。

ここで超重要なのは、「DOMツリーのノードと、レンダーツリーのノード(RenderObject / LayoutObject)は、1対1で対応するとは限らない」という事実なんだ。

—

2. 【深掘り】何がツリーに残り、何が消え去るのか?

ここがフロントエンドのパフォーマンスを左右する、もっとも面白いところだ。
ブラウザは、画面に描画する「価値」があるノードだけを厳選してレンダーツリーに登録する。具体的なルールを見てみよう。

① そもそもレンダーツリーに入らない「非表示」の面々

  • `` や `
frontendintronationalをフォローする

コメント

タイトルとURLをコピーしました