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

フロントエンドのパフォーマンス最適化を学ぶ準備として、HTMLページのレンダリングプロセスを理解する
現在、フロントエンドのパフォーマンス最適化について学んでいます。適切な解決策を見つけ、パフォーマンスのボトルネックを特定するには、ページ レンダリング プロセスを理解する必要があります。私が見たもののいくつかを皆さんと共有します。
参考: レンダラーを理解する
ページのレンダリングには次の特徴があります
• シングルスレッドイベントループ
• 明確に定義された、継続的かつ秩序ある操作(HTML5)
• トークン化とDOMツリーの構築
• リソースをリクエストしてプリロードする
• レンダリングツリーを構築し、ページを描画する
具体的には
ネットワークから HTML の対応するバイトを取得すると、DOM ツリーの構築が開始されます。 UI の更新はブラウザのスレッドが担当します。以下の状況が発生すると、DOM ツリーの構築がブロックされます。
• HTML応答ストリームがネットワーク上でブロックされている
• ロードされていないスクリプトがあります
• スクリプト ノードが検出されましたが、まだロードされていないスタイル ファイルが存在します。レンダリング ツリーは DOM ツリーから構築され、スタイル ファイルによってブロックされます。
シングルスレッドのイベント ループに基づいているため、スクリプトやスタイルのブロックがない場合でも、これらのスクリプトやスタイルが解析、実行、適用されると、ページのレンダリングがブロックされます。
ページのレンダリングがブロックされない状況:
•defer属性とasync属性の定義
• メディアタイプに一致するスタイルファイルがありません
• パーサーによってスクリプトノードやスタイルノードは挿入されません
以下に、例(完全なコード)でこれを説明しましょう

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>
document.write('<script src="other.js"></scr' + 'ipt>');
</スクリプト>
<div>またこんにちは!</div>
<script src="last.js"></script>
</本文>
</html>

コードも分かりやすく、ブラウザで開くとすぐに目的のページが表示されます。次に、スローモーション再生を使用して、どのようにレンダリングされるかを確認してみましょう。

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>...

まず、パーサーは example.css を検出し、ネットワークからダウンロードします。スタイルシートをダウンロードするプロセスは時間がかかりますが、パーサーはブロックされずに解析を続行します。次に、パーサーはスクリプト タグに遭遇しますが、スタイル ファイルがロードされていないため、スクリプトの実行はブロックされます。パーサーがブロックされており、解析を続行できません。

レンダリング ツリーもスタイル ファイルによってブロックされるため、この時点ではどのブラウザーもページをレンダリングしません。つまり、example.css ファイルをダウンロードできない場合、Hi there! は表示されません。
次に、続けます。 。 。

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>
document.write('<script src="other.js"></scr' + 'ipt>');
</スクリプト>

example.css ファイルが読み込まれると、レンダリング ツリーが構築されます。
インライン スクリプトが実行されると、パーサーは other.js によってすぐにブロックされます。パーサーがブロックされると、ブラウザはペイント要求を受信し、ページに「Hi there!」が表示されます。
other.js がロードされると、パーサーは下方向に解析を続けます。 。 。

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>
document.write('<script src="other.js"></scr' + 'ipt>');
</スクリプト>
<div>またこんにちは!</div>
<script src="last.js"></script>

パーサーは last.js に遭遇するとブロックされ、その後ブラウザは別のレンダリング要求を受信し、ページに「Hi again!」と表示されます。最後に、last.js が読み込まれ、実行されます。
ただし、レンダリングのブロックを軽減するために、最新のブラウザでは投機的読み込みが使用されます。

上記の場合、スクリプトとスタイル ファイルによってページのレンダリングが著しくブロックされます。プリロードの目的は、このブロック時間を短縮することだと思います。レンダリングがブロックされると、次の処理が実行されます。
• 軽量のHTML(またはCSS)スキャナがドキュメント内のスキャンを継続します
• 将来使用される可能性のあるリソースファイルのURLを見つける
• レンダラーが使用する前にダウンロードします。ただし、推測によるプリロードでは、JavaScript (例: document.write()) 経由で読み込まれたリソース ファイルを検出できません。

: すべての「最新」ブラウザはこの方法をサポートしています。
上記の例をもう一度見て、プリロードがどのように機能するかを推測してみましょう。

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>...

パーサーは example.css を返し、ネットワークから取得します。パーサーはブロックされず、解析を続行します。インライン スクリプト ノードに遭遇すると、ブロックされます。スタイル ファイルが読み込まれていないため、スクリプトの実行がブロックされます。レンダリング ツリーもスタイルシートによってブロックされるため、ブラウザーはレンダリング要求を受信できず、何も表示されません。ここまでは、先ほど述べたのと同じアプローチです。しかしその後、状況は変わりました。

投機的ローダーはドキュメントの「読み取り」を継続し、last.js を見つけてロードしようとします。次:

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>
document.write('<script src="other.js"></scr' + 'ipt>');
</スクリプト>

example.css が読み込まれると、レンダリング ツリーが構築され、インライン スクリプトを実行できるようになり、その後、パーサーは other.js によって再びブロックされます。パーサーがブロックされた後、ブラウザは最初のレンダリング要求を受信し、ページに「Hi there!」が表示されます。この手順は前の手順と同じです。それから:

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

<html>
<本文>
<link rel="スタイルシート" href="example.css">
<div>こんにちは!</div>
<スクリプト>
document.write('<script src="other.js"></scr' + 'ipt>');
</スクリプト>
<div>またこんにちは!</div>
<script src="last.js"></script>

パーサーは last.js を見つけますが、プリローダーがそれをロードしてブラウザ キャッシュに配置したばかりなので、last.js はすぐに実行されます。その後、ブラウザはレンダリング要求を受信し、ページに「Hi again」と表示されます。
2 つの状況を比較することで、ページ レンダリングについてある程度理解し、的を絞った最適化を行えるようになることを願っています。こんばんは! (終わり)^_^

<<:  このポイントのJavaScriptの基本

>>:  IE8 と Chrome でテーブルの幅を修正する方法

推薦する

純粋な CSS 実装 (スクリプトなし) HTML コマンド スタイルのツールチップ テキスト プロンプト効果

実行プロセスを分析します。マウスをノードに移動して、ノードにツールチップ実装を開くための識別子 (...

Vue3はサイドナビゲーションテキストスケルトン効果コンポーネントをカプセル化します

Vue3プロジェクトのカプセル化サイドナビゲーションテキストスケルトン効果コンポーネント-グローバル...

CocosCreatorのホットアップデートの包括的な説明

目次序文ホットチェンジとはCocos Hot アップデートの概要マニフェストプロジェクトリソースとゲ...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...

VueのTodoListケースの詳しい説明

<テンプレート> <div id="ルート"> <...

Dockerを使用してSpring Bootプロジェクトをデプロイする手順

目次シンプルなSpringbootプロジェクトを作成する1. pom.xmlでSpring Boot...

Vueプロジェクトはログインと登録の効果を実現します

この記事の例では、ログインと登録の効果を実現するためのvueプロジェクトの具体的なコードを共有してい...

mysqlタイムスタンプの使用

序文:タイムスタンプ フィールドは、MySQL でよく使用されます。たとえば、データ行が作成または変...

vue-cli の紹介とインストール

目次1. はじめに2. vue-cli の紹介2.1 コマンドライン2.2 CLI サービス2.3 ...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

フロントエンド HTML+CSS+JS を使用してシンプルな TODOLIST 関数を開発する (メモ帳)

目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...

MySQL タイムブラインドインジェクションの 5 つの遅延方法

MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

Dockerコンテナを終了した後も実行を継続する方法

現象:イメージを実行します (例: ubuntu14.04)。 docker run -it --r...