フロントエンドのパフォーマンス最適化を学習するための準備として、HTML ページのレンダリング プロセスを理解する (続き)

フロントエンドのパフォーマンス最適化を学習するための準備として、HTML ページのレンダリング プロセスを理解する (続き)

昨夜、ブラウザのレンダリングプロセスに関するエッセイを書きましたが、小さなコードで説明しただけでした。ブラウザでテストしていないため、説得力が足りず、不完全な点もまだたくさんありました。今日はブラウザでテストし、その結果を皆さんと共有しました。テストプロセスは少し面倒かもしれませんが、ご理解いただければ幸いです。

テスト済みブラウザ: Chrome v 24.0.1312.52 m、Firefox v18.0、Opera v12.12。

WebKit カーネルでは、Web ページが表示されるときに、HTML ドキュメントを解析し、レンダリング ツリーを生成し、最後にページをレンダリングするパーサーが存在します。これは 1 つのスレッドで実行されるため、2 つが同時に実行されることはありません。

2つのケースに分けて、異なるブラウザでテストしました。

スタイル ファイルはヘッダーにあり、他の 2 つのスクリプト ファイルは、本体の先頭に 1 つ、本体の下部に 1 つあります。スタイルファイルは本文の先頭にあり、スクリプトファイルの場所は上記と同じです。

テスト結果によると、Chrome ではスタイル ファイルの場所が画像のダウンロード時間に影響しますが、他の 2 つのブラウザーでは状況に違いはありません。詳細なテストプロセスは次のとおりです。

テスト 1: スタイル ファイルはヘッダーにあり、他の 2 つのスクリプト ファイルは、1 つは本体の先頭に、もう 1 つは本体の下部にあります。

テスト済みコード:

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html>
<ヘッド>
<title>テストページ</title>
<link rel="スタイルシート" type="text/css" href="example.aspx?sleep=3" />
</head>
<本文>
<div>
やあ!

<script type="text/javascript">
document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");
</スクリプト>

<div>
こんにちは、またお会いしました!</div>
<img src="images/marx.jpg" alt="マルクス" />
<img src="images/engels.jpg" alt="英語" />
<img src="images/Lenin.jpg" alt="レーニン" />

<script src="last.aspx" type="text/javascript"></script>

</本文>
</html>

1. Chromeでのテスト結果

ブラウザでページを開いた後、下図のように Web ページのスクリーンショットをすぐに撮りました (クリックすると拡大画像が表示されます。下図も同じです)。

上図からわかるように、test.htm ドキュメントは読み込まれており、ページにはまだ何も表示されていません。example.css は保留状態ですが、下部の last.js は読み込まれています。これは、Chrome が事前にプリロードしてダウンロードし、ブラウザ キャッシュに配置していることを意味します。 last.js は読み込まれていますが、その前にあるスタイル ファイルがスクリプトの実行をブロックするため、まだ実行されていません。

次に、example.css が読み込まれると、画面に Hi there! が表示されます。ブラウザのスクリーンショットは次のとおりです

ネットワークリクエストから、example.css が読み込まれ、other.js が保留状態になっていることがわかりますが、この時点で script タグ以下の 3 つの画像はダウンロードされています。これはブラウザのプリロード機能によるものです。ただし、ブラウザのレンダリングは other.js スクリプトによってブロックされるため、これら 3 つの画像とそれらの上の「Hi again」は表示されません。なお、現時点では last.js 内のコードは実行されていません。

次に、other.js が読み込まれると、ブラウザはレンダリング ツリーを構築し、「Hi again」と表示して画像を表示します。 last.js は以前にダウンロードされているため、last.js がすぐに実行されます。レンダリングプロセス全体が完了しました。次の図に示すように:

このことから、Chrome は本文内のスクリプト リソースを事前に読み込むことがわかります (スタイル ファイルはテストされません)。JavaScript スクリプトによって動的に読み込まれる JS は、画像ファイルのダウンロードには影響しませんが、その下の画像のレンダリングには影響します。

2. Firefoxでのテスト結果

Firefox でページを開いた後、以下に示すようにすぐにスクリーンショットを撮ります。

これは明らかに Chrome とは異なります。ページには「Hi there!」と表示されますが、背景色が白になっており、スタイル ファイルがまだダウンロードされていないことがわかります。スタイルファイルが読み込まれるまで Chrome には表示されません。

次に、ページ全体が読み込まれると、スクリーンショットは次のようになります。

リクエストのウォーターフォール フローを見ると、Chrome と同様に、ブラウザが last.js をプリロードしていることがわかります。Chrome とは異なり、Firefox は画像をプリロードせず、other.js がロードされるまで待ってから読み込みます。

Firefox では、スタイル ファイルはドキュメントのレンダリングに影響しません (最も一般的な現象は、Web ページが最初はスタイルなしで乱雑に表示されるが、スタイル ファイルをダウンロードすると正常に表示されることです)。body では、JavaScript によって動的に読み込まれる JS ファイルによって、その背後にある画像のダウンロードがブロックされます。

3. Operaブラウザの場合

Opera でテストした結果、Opera ブラウザの方が「ルールを順守している」ことがわかりました。すべてのリソースは順番に読み込まれ、いわゆる事前読み込みはありません。以下は全体的な効果の図です。

Opera では、Chrome と同様に、スタイル ファイルによってページのレンダリングがブロックされます。ただし、Opera のリクエスト ウォーターフォール フローでは、ページ上のすべてのリソースが段階的に読み込まれ、other.js が last.js の前に読み込まれることが示されています。プリロードはありません。

テスト 2: スタイル ファイルは本文の先頭にあり、スクリプト ファイルの場所はテスト 1 と同じです。


コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html>
<ヘッド>
<title>テストページ</title>
</head>
<本文>
<link rel="スタイルシート" type="text/css" href="example.aspx?sleep=3" />
<div>
やあ!

<script type="text/javascript">
document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");
</スクリプト>

<div>
こんにちは、またお会いしました!</div>
<img src="images/marx.jpg" alt="マルクス" />
<img src="images/engels.jpg" alt="英語" />
<img src="images/Lenin.jpg" alt="レーニン" />

<script src="last.aspx" type="text/javascript"></script>

</本文>
</html>

テストの結果、Firefox と Opera ではテスト 1 と同じ結果になりましたが、Chrome では若干異なることがわかりました。テスト 1 では、head のスタイル ファイルが読み込まれるまで画像はダウンロードされませんでしたが、テスト 2 では、以下に示すように、スタイル ファイルと並行してダウンロードされました。

要約:

プリロードは存在しますが、Opera にはありません。Chrome の画像は body 内のスタイル ファイルと並行してダウンロードできますが、head 内のスタイル ファイルと並行してダウンロードすることはできません。スクリプトは、その前のスタイル ファイルが読み込まれた後に実行されます。 Chrome と Opera では、アンロードされたリソースによってその背後にある要素のレンダリングがブロックされますが、Firefox ではブロックされません。テスト結果はブラウザのバージョンに関連している可能性があります。

ここまで読んで、少しわかりにくいと感じましたか? できるだけわかりやすく表現したいのですが、私のレベルが限られているため、これくらいしかできません。不適切な点があれば指摘していただければ幸いです。自分で試してみることもできます。

(終わり)^_^

<<:  Dockerにおけるコンテナとイメージの違いについてお話ししましょう

>>:  Vueアイコンセレクターのサンプルコード

推薦する

React スキャフォールディングのパスエイリアスを設定する方法

この記事を書いている時点でのReactのバージョンは16.13.1です1 npm run eject...

HTML で余分なテキストを省略記号に変換する方法

HTML で余分なテキストを省略記号として表示したい場合は、いくつかの方法があります。 1行テキスト...

MySQL でデータベースを作成した後、ユーザー 'root'@'%' によるデータベース 'xxx' へのアクセスが拒否される問題を解決する

序文最近、仕事で問題が発生しました。データベースを作成した後、データベースに接続するときにエラーが発...

phpmyadmin を使用して MySQL 権限を設定する方法

目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...

Linux ディスクとディスク パーティションを理解するための記事

序文Linux システムのすべてのハードウェア デバイスは、ファイルの形式で表現され、使用されます。...

MySQL で日付を保存するためのベスト プラクティス ガイド

目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...

Enterキーを押すとフォームが自動的に送信されます。予期せぬ発見

コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...

docker inspect コマンドの使用に関するヒント

説明と紹介Docker inspect は Docker クライアントのネイティブ コマンドであり、...

折りたたまれたテーブル行要素のバグ

例を見てみましょう。コードは次の通り非常にシンプルです。コードをコピーコードは次のとおりです。 &l...

新しい CSS :where および :is 疑似クラス関数とは何ですか?

:is と :where とは何ですか? :is()と:where()は、セレクターを作成するとき...

MySQL 権限昇格のさまざまな形態の概要

目次1. Webshel​​lを書く出力ファイルにシェルを書き込むログファイル書き込みシェル2. U...

テーブルの追加と削除の操作を実装する js

この記事の例では、テーブルを追加および削除するためのjsの具体的なコードを参考までに共有しています。...

Linux で PCIe のバージョンと速度を確認する方法

PCIE には 4 つの異なる仕様があります。下の図でそのうちの 2 つを見てみましょう。マザーボー...

この記事では、CSSのようなJSモジュールをインポートする方法を説明します。

目次序文構築可能なスタイルシートとは何ですか? CSSモジュールスクリプトの使用インポートアサーショ...

CSSでよく使われるフォントスタイルを設定することで様々なフォントの変更が可能(例詳細説明)

CSS フォント プロパティは、テキストのフォント ファミリ、サイズ、太字、スタイル (斜体など)...