jsとcssのブロッキング問題の詳細な分析

jsとcssのブロッキング問題の詳細な分析

DOMContentLoadedとロード

まず、その後の分析に役立つ 2 つのイベントを理解しましょう。

ロード イベント: ロードは、完全に読み込まれたページを検出する場合にのみ使用してください。ロード イベントは、リソースとその依存リソースの読み込みが完了したときに発生します。つまり、ロード イベントは、ページの HTML、CSS、JS、画像、その他のリソースが読み込まれた後にのみトリガーされます。

DOMContentLoaded イベント: DOMContentLoaded イベントは、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに、最初の HTML ドキュメントが完全に読み込まれて解析されたときにトリガーされます。つまり、DOM ツリーが構築されたときに DOMContentLoaded イベントがトリガーされます。

js ブロッキングとは何ですか?

JS は実行中に DOM を操作し、リフローと再描画を行う可能性があるため、GUI レンダリング スレッドと JS エンジン スレッドは相互に排他的です。

HTML を解析するときにスクリプト タグが検出されると、レンダリング スレッドはレンダリング プロセスを一時停止し、制御を JS エンジンに渡します。インライン js コードは直接実行されます。外部 js ファイルの場合は、js ファイルをダウンロードし、ダウンロード完了後に実行する必要があります。 JS エンジンの実行が終了すると、ブラウザはレンダリング スレッドに制御を返し、DOM の解析を続行します。

したがって、js は DOM ツリーの構築をブロックします。

それで、ページの表示がブロックされるのでしょうか?次のコードでテストしてみましょう。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <meta http-equiv="X-UA-compatible" content="IE=edge">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <title>ドキュメント</title>
</head>
<本文>
  <div>こんにちは世界</div>
  <スクリプト>
    デバッガ
  </スクリプト>
  <div>こんにちは世界2</div>
</本文>
</html>

このページの DOMContentLoaded は 2.23 秒で発生しており、js が DOM ツリーの構築をブロックしていることがわかります。ただし、hello world はほぼ瞬時にページに表示されるため、js はそれ以前の DOM 要素のレンダリングをブロックしないことがわかります。

より良いユーザー エクスペリエンスを実現するために、最新のブラウザー レンダリング エンジンは、コンテンツをできるだけ早く画面に表示しようとします。レンダリング ツリーをレイアウトする前に、すべての DOM 解析が完了するまで待機しません。代わりに、js ブロッキングが発生すると、すでに構築された DOM 要素が画面にレンダリングされ、白い画面の時間が短縮されます。

そのため、前のページのレンダリングに影響を与えないように、スクリプト タグを body タグの下部に配置します。

CSS ブロッキングとは何ですか?

HTML を解析するときにリンク タグまたはスタイル タグに遭遇すると、スタイルを計算して CSSOM を構築します。

CSS は DOM ツリーの構築をブロックしませんが、ページの表示をブロックします。まだ例を使ってテストしてみましょう:

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <meta http-equiv="X-UA-compatible" content="IE=edge">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <title>ドキュメント</title>
  <link rel="スタイルシート" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css">
</head>
<本文>
  <div class="woo-spinner-filled">こんにちは世界</div>
  <div>こんにちは世界2</div>
</本文>
</html>

外部 CSS ファイルを使用して Slow 3G を開き、より遅いネットワーク速度をシミュレートします。DOMContentLoaded イベントがトリガーされるまでに 30 ミリ秒しかかからないことがわかります。この時点ではページはまだ空白で、loaded イベントが発生してから約 2.92 秒経過するまでコンテンツはページに表示されません。

その理由は、ブラウザは CSSOM の構築中に処理されたコンテンツを一切レンダリングしないからです。 DOM が解析されていても、CSSOM が構築されない限り、ページにはコンテンツが表示されません。

CSSOM はリンク タグまたはスタイル タグに遭遇した場合にのみ構築されるため、リンク タグの前に DOM 要素があると、CSS の読み込み時にブロックが発生します。

<本文>
  <div class="woo-spinner-filled">こんにちは世界</div>
  <link rel="スタイルシート" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css">
  <div>こんにちは世界2</div>
</本文>

そうすると、ページがちらつくという問題が発生します。CSS が読み込まれる前に、ブラウザはデフォルトのスタイルに従って <div class="woo-spinner-filled">hello world</div> をレンダリングします。CSS が読み込まれると、div の新しいスタイルが計算され、再レンダリングされるため、ちらつきが発生します。

ページのちらつきを避けるために、リンク タグは通常、ヘッダーに配置されます。

CSS は後続の js 実行をブロックしますか?答えはイエスです!

JS は変更に関するもので、コンテンツ、スタイル、ユーザー操作への応答など、Web ページのあらゆる側面を変更するのに役立ちます。変更のこれらの「すべての側面」は、本質的には DOM と CSSDOM に対する変更です。 CSSDOM 内の要素のスタイルが JS でアクセスされる場合、JS スクリプトの実行を続行する前に、スタイルがダウンロードされるまで待つ必要があります。

次の例を実行すると、CSS が読み込まれた後にのみコンソールに「this is a test」と表示されることがわかります。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <meta http-equiv="X-UA-compatible" content="IE=edge">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <title>ドキュメント</title>
  <link rel="スタイルシート" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css">
</head>
<本文>
  <div class="woo-spinner-filled">こんにちは世界</div>
  <div>こんにちは世界2</div>
  <スクリプト>
    console.log('これはテストです')
  </スクリプト>
</本文>
</html>

最適化

インライン JavaScript と CSS を使用して、HTML ファイルを取得した直後にレンダリング プロセスを開始できるようにします。

すべての状況がインライン化に適しているわけではないので、無駄なコードを削除したり、webpack などの構築ツールを使用して CSS ファイルと JavaScript ファイルのサイズを圧縮したり、CDN を有効にしてファイルのダウンロードを高速化したりして、ファイル サイズを縮小することもできます。

大きな CSS ファイルの場合は、メディア クエリ属性を使用して、さまざまな目的に合わせて複数の CSS ファイルに分割し、特定の CSS ファイルが特定のシナリオでのみ読み込まれるようにすることができます。

JavaScript ファイルに DOM 関連のコードがない場合、コードに async または defer をマークすることで、JavaScript スクリプトを非同期で読み込むように設定できます。

<script src="index.js"></script>
// ブラウザは、他の処理を実行する前に、index.js が読み込まれて実行されるまで待機する必要があります。

<スクリプト非同期src="index.js"></スクリプト>
//index.js の読み込みは非同期であり、読み込み中にブラウザが他の操作を行うことをブロックしません。
// 読み込みが完了すると、JS スクリプトがすぐに実行されます。

<script を延期 src="index.js"></script>
//JS の読み込みは非同期であり、実行は延期されます。
//defer でマークされたスクリプト ファイルは、ドキュメント全体が解析され、実行されてから DOMContentLoaded イベントがトリガーされるまで待機します。

要約する

js と css のブロッキング問題についての記事はこれで終わりです。より関連性の高い js と css のブロッキング コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3スタイルのCSS変数注入の実装
  • CSS、スタイルの基本を理解する
  • 登録ページを実装するためのJS、CSS、HTML
  • Vue3はCSSの無限シームレススクロール効果を実装します
  • React はモバイル端末を構築するために antd-mobile+postcss を導入しました
  • CSSの不規則な境界線の生成スキームについての簡単な説明
  • CSS グリッチ アートの説明
  • CSS3 はトランジションアニメーションとイージング効果のケーススタディを使用します

<<:  Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル

>>:  Nexus を使用して Docker リポジトリを作成する方法

推薦する

Mybatisの各SQL文の実行時間の統計

背景最近、面接でデータベース トランザクションについてよく質問されます。通常は、@Transacti...

Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

1. Vueプロジェクトのパッケージ化開発されたvueプロジェクトに次の名前を入力し、パッケージ化し...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....

単語のグループ化シーケンスと複数フィールドのグループ化のための MySQL グループ方法

ここで商品テーブルを作成しました。その中のデータを見てみましょう。 mysql> 商品から *...

Docker のポート解放失敗の解決策

今日、非常に奇妙な状況に遭遇しました。docker イメージを更新した後、docker-compos...

HTML/CSS の基礎 - HTML コード記述におけるいくつかの注意事項 (必読)

この記事の警告事項は、ブラウザの互換性とはまったく関係ありません。主に、プロジェクトで遭遇したいくつ...

実行中の Docker コンテナにボリュームを動的に追加する方法

以前、Docker コンテナの起動後にボリュームをマウントできるかどうか尋ねられたことがあります。m...

ウェブページの画像の回転を実現するjs

この記事では、Webページの画像の回転を実現するためのjsの具体的なコードを参考までに共有します。具...

Vue で Axios 非同期リクエスト API を使用する方法

目次基本的なHTTPリクエストの設定async/await を使用した Axios Axios によ...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

表内のコンテンツオーバーフローのレイアウト方法について

コンテンツオーバーフローとは何ですか?実際、テキストが大量にある場合、コンテンツ領域がそれだけの長さ...

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

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

Docker ベースの Redis クラスターの構築方法

Redisイメージをダウンロードする docker pull yyyyttttwww/redis を...

Python Flask WeChat アプレットのログインプロセスとログイン API 実装コード

1. まずは効果を見てみましょうインターフェース要求によって返されるデータ: 2. 公式ログインフロ...

mysql5.7 ユーザー権限の作成、ユーザーの削除、権限の取り消し

1. ユーザーを作成します。注文: 'password' によって識別される ...