- ウェブページの最初の画面のパフォーマンスと最適化戦略の詳細
ディレクトリ
ネタバレ警告:学習プロジェクトに加えて、この記事には反応はありません。今日は基本的な知識に関するすべてです。パフォーマンスツールの使用方法、コアWebバイタルの紹介、Chromeパフォーマンスパネル、初期読み込みパフォーマンスは何ですか、どのインジケーターが測定できるか、キャッシュ制御とさまざまなネットワーク条件がどのように影響するか。
最初の読み込みパフォーマンスインジケーターはじめに
ブラウザを開いて、お気に入りのウェブサイトに移動しようとするとどうなりますか? "
最初に画面上のSO -Caledの「キーパス」をレンダリングします。ユーザーに表示できる最小および最も重要なコンテンツです。
キーパスに含める必要があるのは、複雑な問題です。理想的には、すべてがユーザーに完全なエクスペリエンスをすぐに確認できるようにすることです。しかし、同じものは、「キー」パスであるため、できるだけ速くする必要があるためです。 2つは同時に不可能なので、妥協する必要があります。 妥協はこのようなものです。ブラウザは「キーパス」を構築すると想定しています。少なくとも次の種類のリソースが必要です。
ブラウザは、初期HTML
は、知覚されたの初期負荷を測定するため、最も重要なパフォーマンスインジケーターの1つです。基本的に、これはユーザーのWebサイト速度の予備的な印象です。 この瞬間まで、ユーザーは爪を噛むために空白の画面を見つめていました。 Googleによると、良好なFCP数は1.8秒未満です。その後、ユーザーは、ウェブサイトが提供できるコンテンツへの関心を失い、去り始める可能性があります。
このため、ブラウザは開始を完了する必要があります。非ブロッキングJavaScriptの残りの部分を待っており、それを実行し、画面上のDOMに変更を適用し、画像をダウンロードし、他の方法でユーザーエクスペリエンスを改善します。 プロセスの特定の時点で、最大コンテンツの描画時間が発生します。これは、FCPのような最初の要素ではなく、ページのメインコンテンツ領域(可視ポート)に表示される最大のテキスト、画像、またはビデオです。 Googleによると、この数値は2.5秒未満 にする必要があります。この数よりも、ユーザーはウェブサイトが遅いと考えるでしょう。
これらすべてのインジケータは、GoogleのWeb Vitalsの一部です。ページ上のユーザーエクスペリエンスのインデックスセットです。 LCPは、3つのコアWebバイタル - 3つのインジケータの1つであり、ユーザーエクスペリエンスのさまざまな部分を表しています。 パフォーマンスの読み込み
これらの指標は、灯台を介して測定できます。 LighthouseはGoogleパフォーマンスツールです。これは、Chrome Devtoolsに統合されており、Shell Script、Webインターフェイス、またはノードモジュールを実行できます。制作環境で戻る前に、構造中に実行して検出できるように、ノードモジュールとして使用できます。ローカルデバッグとテストには、統合されたDevToolsバージョンを使用します。競合他社のパフォーマンスを確認するWebバージョン。
オーバーブトゥールの概要
上記は、プロセスの非常に簡潔で簡素化された説明です。しかし、人々を混乱させる多くの略語と理論があります。個人的には、そのようなコンテンツを読むのは役に立たない。動作しているので自分で操作できない限り、すぐにすべてを忘れます。
この特定のテーマでは、これらの概念を完全に理解する最も簡単な方法は、セミリアルページでさまざまなシーンをシミュレートし、結果をどのように変更するかを確認することであることがわかります。したがって、より多くの理論の前に(たくさんあります!)、これをしましょう。 プロジェクト設定
建設プロジェクト: サーバーを起動:
必要なdevtools を探索します
灯台パネルを開きます。そこには、いくつかの設定と「分析ページの読み込み」ボタンが表示されます。 ローカルパフォーマンスは完璧ですが、これは驚くことではありません - すべてが「私のマシンで実行されています」。 次の指標もあります
ここで必要なFCP値とLCP値は、上部にあります。 以下に、スコアを改善するのに役立つ提案のリストが表示されます。
ただし、灯台は表面情報のみを提供し、遅いネットワークや低いCPUなどのさまざまなシナリオをシミュレートすることはできません。それは単なる良いエントリポイントであり、時間の経過とともにパフォーマンスを追跡するための優れたツールです。何が起こっているのかをより深く理解するには、 パネルが必要です。
3 つの主要な Web Vitals メトリクスが表示されます。そのうちの 1 つは LCP で、遅いネットワークと CPU をシミュレートしたり、パフォーマンスの詳細を経時的にログに記録したりできます。 パネルの上部にある [スクリーンショット] チェックボックスを見つけて選択し、[記録して再ロード] ボタンをクリックします。Web サイトが自動的に再ロードされたら、記録を停止します。これは、ページの初期読み込み中に何が起こったかに関する詳細なレポートになります。 このレポートにはいくつかのセクションが含まれています。 一番上には、通常の「タイムラインの概要」 セクションがあります。 ここでは、サイトで何かが起こっていることがわかりますが、それ以上のことは何もありません。カーソルを合わせると、何が起こっているかのスクリーンショットが表示され、特定の範囲を選択してズームインして詳しく見ることができます。 その下には、ネットワークセクションがあります。展開すると、ダウンロードされているすべての外部リソースとその正確な時間がタイムラインに表示されます。特定のリソースの上にマウスを置くと、ダウンロードのどの段階で費やされた時間の詳細が表示されます。赤い隅のリソースは、リソースがブロックされていることを示します。 学習プロジェクトを使用している場合は、まったく同じ画像が表示されます。これは、前のセクションで説明した内容と一字一句一致します。 ここで学習プロジェクトのコードを開いて dist フォルダーを表示すると、ソース コードは次の動作と一致します。 プロジェクトに取り組んでいる場合は、その初期読み込みパフォーマンスに注目し、[ネットワーク] パネルを確認してください。さらに多くのリソースがダウンロードされる可能性があります。 「ネットワーク」セクションの下に「フレーム」セクションと「タイミング」セクションがあります。 これはかなりクールです。 「タイミング」セクションでは、これまでに説明したすべてのメトリクス (FP、FCP、LCP) と、まだ説明していないメトリクスを確認できます。メトリックの上にマウスを置くと、かかった正確な時間を確認できます。それらをクリックすると、一番下の [概要] タブが更新され、このメトリックに関する情報と詳細を確認するためのリンクが表示されます。 DevTools は現在、人々を教育することを目的としています。 最後にメイン部分です。これは、記録されたタイムライン中にメインスレッドで発生することです。 ここでは、「HTML の解析」や「レイアウト」などの内容と、それに要した時間を確認できます。黄色の部分は JavaScript に関連していますが、縮小された JavaScript を備えた製品版を使用しているため、少し役に立ちません。ただし、この状態であっても、たとえば HTML の解析やレイアウトの描画に比べて、JavaScript の実行にどれくらい時間がかかるかを大まかに知ることができます。 ネットワーク と メイン の両方が開いており、画面全体を占めるまで拡大されている場合のパフォーマンス分析に特に役立ちます。 ここから、サーバーが非常に高速で、バンドルが非常に高速で小さいことがわかります。特定のネットワーク タスクがボトルネックになることはありません。ボトルネックとなるネットワーク タスクには長い時間がかかりません。ブラウザはその間にぶらぶらして独自の作業を行うだけです。したがって、ここで初期ロードを高速化したい場合は、「HTML の解析」がなぜ非常に遅いのかを調べる必要があります。これはグラフ上で最も長いタスクです。 あるいは、絶対的な数字を見てみると、パフォーマンスの観点から、ここでは何もするべきではありません。全体の初期ロード時間は 200 ミリ秒未満で、Google が推奨するしきい値を大幅に下回っています。しかし、このテストをローカルで実行しており (したがって実際のネットワーク コストは発生しません)、非常に高速なラップトップで、非常に基本的なサーバーを使用しているため、このようなことが起こっています。 現実の生活をシミュレーションしてみましょう。 最初に、サーバーをより現実的にしましょう。現在、最初の「青」ステップは約50ミリ秒で、そのうち40ミリ秒が待っています。
https://www.php.cn/link/def14e8541708294d7558fdf2126ef27)。コメントを見つけてください> //スリープ(500)を待って、注釈をキャンセルします。これにより、HTMLを返す前にサーバーが500ミリ秒遅れます。これは、古い複雑なサーバーにとって妥当と思われます。
reプロジェクト(npm run build)を構築し、再起動(npm run start)、パフォーマンスレコードを再実行します。 最初の青い線を除いて、残りと比較されたタイムラインに変更はありませんが、今は非常に長いです。 の努力が必要です。より効果的な戦略は、サーバーに集中し、なぜそれがそんなに遅い理由を見つけることです。
をシミュレートします
誰もが1ギガビット接続の世界に住んでいるわけではありません。たとえば、オーストラリアでは、50兆/秒が高速インターネット接続の1つであり、月額約90ドルを費やします。もちろん、それは3Gではなく、世界中の多くの人々が閉じ込められています。それでも、ヨーロッパ人の1ギガビット1/秒または10ユーロのインターネットプランを聞くたびに、私は泣きます。
とにかく Chromeバージョンに表示されない場合、「ネットワーク」タブで同じ設定を使用できるはずです。 新しい構成ファイルを「ネットワーク」ドロップダウンメニューに追加し、次の番号を使用します。
値にはほとんど変化がありません。最初の青い「サーバー」部品には変更がありません。説明できます。最も基本的なHTMLのみを送信するため、ダウンロードしてください。
しかし、ダウンロード可能なリソースとメインスレッドの関係は劇的に変化しました。 レンダリングのブロックCSS
その後、技術的には、ブラウザをいくつかのコンテンツを描画できますが、コンテンツはありませんが、HTMLファイルに空のDIVのみを送信します。したがって、ブラウザはJavaScriptファイルをダウンロードして実行するまで続行します。
約60ミリ秒の待機ギャップは、 の増加です。 さらに速度を下げて進行状況を表示します。新しいネットワーク構成ファイルを作成し、「低インターネット帯域幅」に名前を付け、「低いインターネット帯域幅」構成ファイルからダウンロード/アップロード番号をコピーし、遅延を40ミリ秒に設定します。
そして再度テストを実行します。 LCP値は現在、ほぼ500ミリ秒に増加しています。 JavaScriptは約300ミリ秒をダウンロードします。比較的言えば、「分析的HTML」タスクの重要性とJavaScriptの実行タスクが減少しています。
ここで最も興味深い部分は、「リクエストを送信して待機する」ことです。これには約40ミリ秒かかります。残りのネットワークリソースにマウスを吊るします - これらすべてにそれがあります。それが私たちの待ち時間です。ネットワークの遅延を40に設定します。多くのことが遅延数に影響します。ネットワーク接続のタイプはその1つです。たとえば、平均3G接続帯域幅は10/1 Mbpsで、100〜300ミリ秒の間で遅延します。
数字がさらに宣伝されます。私にとっては です。
今こそ興味深い部分です。帯域幅を超高速に復元すると、遅延が低く抑えればどうなりますか?この設定を試してみましょう:
:1000 mbps 960 millisecond
常に保証する」と呼ばれます。
の重要性
CDN(コンテンツ配信ネットワーク)は、基本的にはフロントエンドのパフォーマンス作業の0番目のステップであり、より派手なもの(コードセグメンテーションやサーバーコンポーネントなど)を検討し始める前でさえです。
CDN(コンテンツ配信ネットワーク)の主な目的は、遅延を減らし、できるだけ早くエンドユーザーにコンテンツを配信することです。彼らはこれのためにさまざまな戦略を実装しました。この記事の中で最も重要な2つは、「分散サーバー」と「キャッシュ」です。 CDN プロバイダーは、地理的に異なる場所に複数のサーバーを持ちます。これらのサーバーは静的リソースのコピーを保存し、ブラウザーが要求したときにユーザーに送信できます。 CDN は基本的にオリジン サーバーの周囲のソフト層であり、オリジン サーバーを外部の影響から保護し、外部とのやり取りを最小限に抑えます。これは、実際の人間を介さずに典型的な会話を処理できる内向型の人向けの AI アシスタントのようなものです。 上記の例では、サーバーはノルウェーにあり、クライアントはオーストラリアにあり、次のようなイメージがあります: CDNを挟むとイメージが変わります。 CDN はユーザーに近いサーバー (たとえばオーストラリアのどこか) にサーバーを置きます。ある時点で、CDN はオリジン サーバーから静的リソースのコピーを受信します。オーストラリアまたはその近郊のユーザーは、ノルウェーのサーバーからオリジナルのコピーではなく、これらのコピーを取得することになります。 それは 2 つの重要なことを達成します。まず、ユーザーがオリジン サーバーに直接アクセスする必要がなくなるため、オリジン サーバーの負荷が軽減されます。第 2 に、JavaScript ファイルをダウンロードするために海を渡る必要がなくなったため、ユーザーはこれらのリソースをより迅速に入手できるようになりました。 上記のシミュレーションの LCP 値は 960 ミリ秒から 640 ミリ秒? に低下しました。 これまでは、初回訪問のパフォーマンス、つまりサイトを訪れたことのない人に対するパフォーマンスについてのみ説明してきました。しかし、このサイトが非常に優れているので、初めての訪問者のほとんどが定期的な訪問者になってくれることを願っています。少なくとも、最初の読み込み後は離れず、数ページ閲覧し、おそらく何かを購入するでしょう。この場合、通常、ブラウザーが静的リソース (CSS や JS など) をキャッシュすること、つまり、常にダウンロードするのではなく、そのコピーをローカルに保存することを期待します。 この場合、パフォーマンスのグラフと数値がどのように変化するかを見てみましょう。 学習プロジェクトを再度開きます。開発ツールで、ネットワークを以前に作成した「平均 3G」に設定します。遅延が大きく帯域幅が狭いため、違いがすぐにわかります。 「ネットワークキャッシュを無効にする」チェックボックスがオフになっていることを確認してください。 まず、ブラウザを更新して、初めての訪問者が排除されていることを確認してください。次に、更新してパフォーマンスを測定します。 学習プロジェクトを使用している場合、最終結果は次のようになり、少し驚くかもしれません: CSS および JavaScript ファイルは依然として [ネットワーク] タブで非常に目立ちますが、[リクエストを送信して待機] (「平均 3G」プロファイルで設定した遅延設定) では約 300 ミリ秒が表示されます。その結果、LCP は可能な限り低くならず、ブラウザーが CSS のブロックを待機しているときに 300 ミリ秒のギャップが生じます。 何が起こったのですか?ブラウザはこれをキャッシュすべきではないでしょうか? 何が起こっているかを理解するには、[ネットワーク] パネルを使用する必要があります。それを開いて、そこにある CSS ファイルを見つけます。次のようになります: ここで最も興味深いのは、「ステータス」列と「サイズ」です。 「サイズ」は、CSS ファイル全体のサイズではありません。小さすぎます。 「ステータス」では、通常の 200 の「すべて問題ありません」ステータスではなく、別の 304 ステータスです。 ここで 2 つの質問があります。なぜ 200 ではなく 304 なのか、そしてそもそもなぜリクエストが送信されたのか?キャッシュが機能しないのはなぜですか? まず、304 応答です。これは、適切に構成されたサーバーが条件付きリクエストに対して送信する応答であり、応答はさまざまなルールに基づいて変化します。このようなリクエストは、ブラウザーのキャッシュを制御するためによく使用されます。 たとえば、サーバーは CSS ファイルのリクエストを受信すると、ファイルが最後に変更されたのがいつかを確認できます。この日付がブラウザ側のキャッシュ ファイルの日付と同じである場合、空の本文を持つ 304 が返されます (そのため、223 B のみになります)。これは、ブラウザがすでに所有しているファイルを安全に再利用できることを意味します。帯域幅を無駄にして再ダウンロードする必要はありません。 これが、パフォーマンス画像に大きな「リクエストを送信して待機」という数字が表示される理由です。ブラウザは、CSS ファイルがまだ最新であるかどうかをサーバーに確認するよう求めています。そのため、「コンテンツのダウンロード」には 0.33 ミリ秒かかります。サーバーは「304 Unmodified」を返し、ブラウザは以前にダウンロードしたファイルを再利用するだけです。 さて、2 番目の質問 - そもそもなぜこのリクエストが送信されたのでしょうか? この動作は、サーバーが応答で設定する Cache-Control ヘッダーによって制御されます。 [ネットワーク] パネルで CSS ファイルをクリックして、リクエスト/レスポンスの詳細を表示します。 「ヘッダー」タブの「応答ヘッダー」ブロックで「Cache-Control」値を探します:
このヘッダーでは、異なる組み合わせでコンマで分離できます。この例には、2つあります
この操作を実行するのに必要な時間は、「最初のバイト時間」(TTFB)と呼ばれます。送信要求から到着の結果の結果までの時間です。 HTMLを受信した後、ブラウザはこのHTMLをできるだけ早く利用可能なWebサイトに変換する必要があります。 サーバーから受け取った最初のHTMLは、実際のDOM要素を構築し、エクスペリエンスを構築するために使用されています。
ブラウザは、サーバーの最初の要求で最初(HTML)を取得します。それはそれを分析し、このプロセスの「キーパス」を完了する必要があるCSSファイルとJSファイルのリンクを抽出し始めました。次に、サーバーからそれらを取得し、ダウンロードし、それらを処理し、これらすべてを組み合わせて、特定の瞬間に画面に「キーパス」ピクセルを描画するのを待つリクエストを送信します。
プロセスでは、ラベルからCSSおよびJSリソースのリンクを抽出します。
と呼ばれるものです。ユーザーが画面に何かを見る機会があるのはこれが初めてです。それが起こるかどうかは、サーバーから送信されたHTMLによって異なります。テキストや画像などの意味のあるものがある場合、これは最初のコンテンツ描画(FCP)の時間でもあります。 HTMLが単なる空のDIVである場合、FCPは後で発生します。 https://www.php.cn/link/def14e8541708294d7558fdf2126ef27
<code>npm install</code>
<code>npm run build</code>
<code>npm run start</code>
さらに、この記事で他の操作を実行する前に、「無効なキャッシュ」チェックボックスが有効になっていることを確認してください。上部の「ネットワーク」パネルに配置する必要があります。
追加の演習
さまざまなネットワーク条件を探索します
非常に遅いサーバー
リソースバー内で起こったことも非常に興味深いです。黄色のJavaScriptバーにマウスを掛けます。このコンテンツはそこに表示されるはずです:アップロード
数値は約リピートアクセスパフォーマンス
Cache-Control ヘッダーを使用してブラウザーのキャッシュを制御します
追加の演習
以上がReact 開発者向けの初期ロード パフォーマンス: 詳しい調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。