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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル
>>: Nexus を使用して Docker リポジトリを作成する方法
エラー発生: MySQL 5.7 から SQL にデータベースをエクスポートし、それを MySQL ...
目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...
この本「グラフィックデザイナーとして成長する」は多くの人が読んでおり、私もオリジナルの PDF 版を...
UI コンポーネントを作成するときに、アニメーションを考慮しなければ、アニメーションを実現するのは非...
目次1. 基本的な使い方2. 指示の動作原理2.1. 初期化2.2 テンプレートのコンパイル2.3....
この記事では、ファイルのアップロードとダウンロード機能を実装するためのVueの具体的なコードを例とし...
navicatを使用してテストと学習を行います。まず、 set autocommit = 0;を使用...
背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...
Docker では、ポート マッピングを使用して、Docker コンテナーのサービスをホスト マシン...
[LeetCode] 176. 2番目に高い給与従業員テーブルから 2 番目に高い給与を取得する ...
コンテナが起動した後まず管理者にログインして新しいユーザーを作成してください $ docker ex...
通常、すべての Web サイトは、多くの非検索エンジン クローラーに遭遇します。これらのクローラーの...
表は以下のとおりです。 Unity が読み取って呼び出すときのコード: データベース内の別のテーブル...
最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...
目次概要コンソールログコンソール.infoコンソール.警告コンソールエラーコンソールテーブルコンソー...