目次
1. はじめに
このページでは、Chrome ブラウザのデベロッパーツールを使って、ウェブブラウザがウェブページを取得して表示するまでの流れについてまとめます。
ウェブブラウザが特定のウェブページ(リソース)を取得して表示する過程には、多くの処理が含まれますが、これをざっと理解するためには、ウェブブラウザのデベロッパーツールが役に立ちます。
2. Chrome デベロッパーツールの [Network]パネル
Chrome デベロッパーツールは、[設定]アイコン – [その他のツール] – [デベロッパーツール]から開くことができます。
この中にある [Network] パネルでは、ウェブブラウザがウェブサーバーにリクエストした各リソース毎に「どの処理に」「どのくらい時間が掛かったか」がグラフで表示されます(他のメジャーなウェブブラウザでも同じようなツールがついています)。
※ グラフが表示されない場合は、画面をリロードしてください。
このグラフについての説明は、Network Analysis Reference | Tools for Web Developers | Google Developers(日本語訳)に記述されているのですが、見辛いのでここでもまとめておきます。
3. リソース毎の処理の流れ
1つのリソースに対する処理の流れを、以下の表にまとめました。
一番左にある[No.]列の背景色は、[Network] パネル内のグラフの色と対応させています。
No. | フェーズ | 説明 |
---|---|---|
Resource Scheduling | ||
1 | Queueing | キューに入れられている時間 ※ この時間が発生する要因
|
Connection Start | ||
2 | Stalled | リクエストを送信できるようになるまでの待機時間 ※ この時間が発生する要因
|
3 | DNS Lookup | DNS により、ホスト名を名前解決してIPアドレスを取得するのにかかった時間 |
4 | Initial connection | 接続の確立にかかった時間
※ HTTP/2 だと、1度のページ取得あたり 1回で済む
|
Request/Response | ||
5 | Request sent | ネットワーク リクエストの発行にかかった時間(通常は、1000 分の 1 秒以下) |
5a | ServiceWorker Preparation | ブラウザが service worker を起動した時間 |
5b | Request to ServiceWorker | リクエストが service worker に送信されている時間 |
6 | Waiting (TTFB) | リクエスト送信後、レスポンスとして最初のバイトを受け取るまでの時間(TTFB: Time To First Byte) ※ 主に以下の2つの時間の合計です。
|
7 | Content Download | レスポンス データの受信にかかった時間 |
4. その後の流れ
最初のHTMLファイルをダウンロードするあたりからの処理の流れ
(CSS, JavaScript, 画像ファイルなど。並列に行われる)
※ あくまで私の理解している内容です。細かく見ると正確でない部分もあると思います。
No. | 説明 |
---|---|
1 | readyState が loading になる。
|
2 | No.1 の処理の途中、その時点での DOM ツリーと CSSOM ツリーを元に以下の処理も始まる
※「すべてのリソースが処理されてから、この工程が1回だけ行われる」だと、ブラウザのウィンドウに何も表示されない状態が長く続いてしまうため、DOMパーシングの段階に応じて、この工程が複数回実行される。大きなページであればこの回数は多くなる。 |
3 | 完全なDOMツリーが完成したら(= HTMLを最後までパースし、見付かった JavaScript(async は除く)をすべて実行したら。見付かったCSSは最後まで処理できてなくてよい。)、DOMContentLoaded イベント 発生
|
4 | すべてのファイル(画像も含む)をダウンロードしたら、Load イベント発生
|
<script>
タグの async
属性と defer
属性
async
属性もしくは defer
属性がセットされた <script>
タグでは、HTMLのパース処理をブロックせずに JavaScriptファイルがダウンロードされます。違いは以下です。
async
属性
- JavaScriptファイルがダウンロードされたら即座に実行します。なのですが、非同期での実行であるため、パース処理の続きはすぐに再開されるでしょう。
- ライブラリを読み込むのに適しています(DOMツリー構築前にライブラリがロードできるため)。
- ライブラリであれば「実行」されるタイミングで行われるのは、コードがロードされるくらいなので、HTMLのパース処理をブロックする時間は短くて済みます。
defer
属性
- HTMLのパースが終わってから実行されます。
- そのため「実行時」に、DOMに対する処理を行う JavaScriptファイルを読み込むのに適しています。
詳細は、4.12.1 The script element | HTML Standard を参照してください。
デモページを用意しました。
5. DOMContentLoaded と load イベント
DOMContentLoaded と load イベントは、[Network] パネル内にも表示されます。
また、ウェブページを閉じる際には、beforeunload イベント → unload イベントがトリガーされます。
参考
6. グラフサンプルとその説明
HTMLファイル、CSSファイル、JavaScriptファイル、画像ファイルを使ったウェブページを読み込んだ場合の、[Network] パネルを一つ紹介します。
(クリティカル レンダリング パスのパフォーマンスを分析する | Web | Google Developers で紹介されている例です)
- HTML ファイルをリクエストして、ダウンロードまで行います。
- HTMLをパースします。
- CSSファイルが参照されていたのでダウンロードを開始します。
- 画像ファイルが参照されていたのでダウンロードを開始します。
- JavaScriptファイルも参照されていましたが、すぐにダウンロードは行わず、CSSOM が構築できるまでキューに入れて待ちます。
- ダウンロードが終わったCSSをパースして CSSOM の構築を行ったら、JavaScriptファイルのダウンロードを開始します。
- ダウンロードが終わったら、JavaScript のパース・実行を行います。
- DOMContentLoaded イベントが発生します。
- レンダリング(画面の表示)が開始されます。
- 画像ファイルはサイズが大きいため、やっとダウンロードが完了しました。
- load イベントが発生します。
※ 一番下のファイル (inject.js)は無視して下さい。
7. 参考
- Network Analysis Reference | Tools for Web Developers | Google Developers(日本語訳)
- Resource Timing について | Tools for Web Developers | Google Developers
- クリティカル レンダリング パスのパフォーマンスを分析する | Web | Google Developers
- クリティカル レンダリング パス | Web | Google Developers
- Document: readyState プロパティ – Web API | MDN
(資料) 電子情報学特論:Chromiumのアーキテクチャを解き明かす – Google スライド
電子情報学特論:Chromiumのアーキテクチャを解き明かす – Google スライド というスライドがとても勉強になります。
その中から、2つスライドを載せておきます。