【入門編】 メインスレッドの役割と制約 – Webブラウザの仕組み実践ガイド

やあ、ようこそ。ブラウザという広大な宇宙の裏側へ。
私は、長年ブラウザのレンダリングエンジンと格闘し、時にはその繊細さに涙し、時にはその合理的な美しさに救われてきた、一人のチーフアーキテクトです。

今日は、フロントエンド開発者が必ず一度はぶつかる壁——「なぜ、私の作ったサイトはカクつくのか?」という謎を解き明かすために、ブラウザの心臓部である「メインスレッド」のお話をしましょう。

難しい話は抜きです。コーヒーでも飲みながら、私たちのブラウザの中で健気に働く「一人の職人さん」の物語だと思って、リラックスして聞いてくださいね。

—

1. メインスレッドは「たった一人で切り盛りする定食屋」

Webブラウザを動かしているのは、実は驚くほど孤独なヒーローです。それが「メインスレッド」です。

想像してみてください。あなたは、地元で人気の定食屋の店主です。
この店には、あなた一人しかいません。

1. 注文を受ける(JavaScriptの実行)
2. 献立を考える(スタイル計算)
3. お皿の配置を決める(レイアウト/リフロー)
4. 料理を盛り付ける(ペイント/リペイント)

これを全部、あなた一人で、順番にこなさなければなりません。これがブラウザの「メインスレッド」の正体です。

ブラウザの画面が滑らかに動く(秒間60フレーム)ためには、これらすべての作業をわずか0.016秒(16ミリ秒)以内に終わらせて、次のお客さんに料理を出さなければならないんです。過酷だと思いませんか?

—

2. 作業の流れ:職人がこなす4つの工程

ブラウザが画面を書き換えるとき、メインスレッドは必ず以下のステップを順番に踏みます。これを飛ばすことはできません。

① JavaScript実行(注文の受付)

「ボタンが押されたら、この色を変えて!」という指示を処理します。ここで店主(メインスレッド)が複雑すぎる計算を始めると、次のお皿の準備に進めません。

② スタイル計算(レシピの確認)

「この要素にはどの色が塗られるべきか?」を計算します。CSSのルールを全部チェックして、最終的な見た目を決定します。

③ レイアウト / リフロー(お皿の配置)

「このボタンの幅は何ピクセルで、どこに置くか?」を決める作業です。
ここが一番大変な作業です。 誰か一人の場所が変わると、後ろに並んでいる全員の場所を再計算しないといけないからです。これを「リフロー」と呼びます。

④ ペイント / リペイント(盛り付け)

場所が決まったら、いよいよ色を塗ります。文字を書き、背景色を塗り、影をつけます。

—

3. なぜ画面が「固まる」のか?(ブロッキングの正体)

ここで一番の注意点があります。メインスレッドは「一度に一つのことしかできない」ということです。

もし、JavaScriptのステップで「100万回計算して!」なんていう重い注文が入ったらどうなるでしょう?
店主は計算に没頭し、料理を盛り付ける(ペイント)ことができなくなります。

お客さん(ユーザー)から見れば、「ボタンを押したのに反応しない」「スクロールが止まった」という状態になります。これが「メインスレッドのブロッキング」です。

現場の泥臭い話をすると、私たちはよく「JSを軽くしろ!」と言われます。それは、この店主を計算づめにせず、一刻も早く「盛り付け(描画)」の作業に戻してあげたいからなんです。

—

4. 実際に「ブロッキング」を体験してみよう

言葉で言うより、実際に見てみるのが一番です。
以下のコードは、メインスレッドをわざと「忙しく」させて、画面をフリーズさせる実験用のコードです。





メインスレッドの実験室


メインスレッドの働きを見てみよう

この円は、メインスレッドが空いていればスムーズに回ります。

ボタンを押すと、店主(メインスレッド)が計算に没頭します。



これを実行してボタンを押すと、上の「くるくる(アニメーション)」がピタッと止まるはずです。
店主がループ処理に捕まってしまい、「次のコマを描画する」という仕事ができなくなったからです。

---

5. 賢い店主の必殺技:コンポジット合成

「じゃあ、重い処理をしたら絶対にカクつくの?」
そんなことはありません。現代のブラウザには「コンポジット合成」という救世主がいます。

これは例えるなら、「別室にいる凄腕の看板職人(GPU)」です。

メインスレッド(店主)が忙しくても、特定の作業(透明度を変える、位置をずらすなど)だけは、店主を通さずにこの看板職人が直接画面を書き換えてくれます。
これを活用するのが、`transform` や `opacity` を使ったアニメーションです。これらはメインスレッドの負担を劇的に減らしてくれます。

---

6. 私たちが意識すべき「優しさ」

最後に、私がジュニアアーキテクトにいつも伝えていることをあなたにも贈ります。

ブラウザの仕組みを学ぶと、「効率的なコードを書かなきゃ」と身構えてしまうかもしれません。でも、一番大切なのは「メインスレッドという一人の職人を、いかに楽にさせてあげるか」という優しさです。

  • リフローを避ける: 家具を全部動かすような大きな変更を頻繁にしない。
  • 処理を小分けにする: 100個の仕事を一度に渡さず、隙間時間で少しずつやってもらう(`requestAnimationFrame` などの活用)。
  • GPUを頼る: 派手な動きは、店主ではなく看板職人(GPU/CSS transform)に任せる。

最初は分からなくても大丈夫。
「あ、今店主を困らせてるかも?」とふと思う瞬間があるだけで、あなたの書くコードは昨日よりもずっと、ユーザーに優しいものになっているはずですよ。

もし迷ったら、いつでもこの定食屋の店主を思い出してくださいね。応援しています。

コメント

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