ウェブサイトのページ読み込み時間を最適化していました。 1つの方法は、CSSの複数のHTTP要求を1つの結合HTTP要求に結合することでした。しかし、あるレビュアーの1人が興味深い質問をしました。複数のCSSファイルのダウンロードを並列化すると、ページのロード時間が短縮されないのでしょうか?
インターネットで読んだ唯一のことは、(ブロックする)HTTPリクエストの数を減らすことがWebページの高速化の鍵であるということです(ただし、Google Pagespeed Insightsはこれを明確に述べていないようです 1 )。
並列化によってパフォーマンスが改善されない、またはほとんど問題にならない(いくつかのHTTPリクエストを使用する利点を上回る)理由がいくつかあります。
それでは、CSSファイルのHTTPリクエストを並列化することに何か利点はありますか?
注/更新:すべてのCSSファイルはレンダーブロックです。まだクリティカルパスの外に移動されていないCSSファイル。
HTMLが解析されると、HTMLドキュメントからリンクされたCSSファイルが並列ダウンロードキューに追加されます。重要なことは、非同期JavaScriptリンクがHTMLパーサーをブロックし、そのJavaScriptがダウンロード、解析、実行されるまで、後のタグがダウンロードキューに追加されないようにすることです。[1]
ブラウザに4つのファイルのうち3つを順番に(少なくとも3回の往復)強制的にダウンロードさせる例を次に示します。
<head>
<script src="js/fizz.js"></script>
<link rel="stylesheet" href="css/foo.css"/>
<script src="js/buzz.js"></script>
<link rel="stylesheet" href="css/bar.css"/>
</head>
以下の例では、4つのファイルすべてが並行して(少なくとも1回の往復)ダウンロードされるように作り直されています。
<head>
<link rel="stylesheet" href="css/foo.css"/>
<link rel="stylesheet" href="css/bar.css"/>
<script async src="js/fizz.js"></script>
<script src="js/buzz.js"></script>
</head>
別の注意:CSSファイルは(デフォルトでは)パーサーブロックではなくレンダーブロックです。ページは引き続き解析され、DOMが構築されますが、レンダリングは開始されません CSSOMが構築されるまで
CSSを分割する主な理由は、スクロールせずに見えるコンテンツをクライアントにレンダリングし、できるだけ早く解析するために必要な最小限のルールを取得することです。すぐに表示されないものの残りのルールは、リンクタグ内のmedia
クエリで不必要にレンダリングをブロックするようにマークするか、非同期に読み込まれたJavaScriptによってページに追加できます。
そのため、CSSのダウンロードをそれ自体のために並列化することには明確な利点はありません。しかし、いつものように、測定してテストしてください!
さらに読むには、Googleの「Webの基礎:パフォーマンスの最適化」に関する次の記事をお勧めします。 https://developers.google.com/web/fundamentals/performance/
[1]:これは、一部のブラウザーの投機解析機能を無視しています:
https://developer.mozilla.org/en-US/docs/Web/HTML/Optimizing_your_pages_for_speculative_parsing