Optymalizowałem czas wczytywania strony w witrynie. Jednym ze sposobów było połączenie wielu żądań HTTP dla CSS w jedno połączone żądanie HTTP. Ale jeden z recenzentów zadał interesujące pytanie: czy paralelizacja pobierania wielu plików CSS nie skróciłaby czasu ładowania strony?
Nigdy nie zastanawiałem się nad tą opcją, ponieważ jedyne, co czytam w Internecie, to to, że zmniejszenie liczby (blokujących) żądań HTTP jest kluczem do szybszej strony internetowej (chociaż Google Pagespeed Insights nie wydaje się jasno to określać 1 ).
Widzę kilka powodów, dla których paralelizacja nie poprawiłaby wydajności lub miała tylko bardzo małe znaczenie (przewaga korzyści z używania mniejszej liczby żądań HTTP):
- Ustanowienie nowego połączenia jest kosztowne. Chociaż konfigurowanie wielu połączeń może odbywać się równolegle, przeglądarki używają co najwyżej około 4-6 połączeń (w zależności od przeglądarki), więc równoległe pobieranie CSS zablokowałoby pobieranie innych zasobów, takich jak JavaScript i obrazy.
- Konfiguracja połączenia HTTPS wymaga dodatkowych danych. Przeczytałem, że może to być z łatwością kilka KB danych. To dodatkowe dane, które należy przesłać przewodowo, zamiast CSS, który faktycznie chcemy wysłać.
- Ze względu na algorytm TCP Slow Start, im więcej danych zostanie wysłanych przez połączenie, tym szybsze będzie połączenie. Tak długo trwające połączenia faktycznie wysyłałyby dane znacznie szybciej niż nowe połączenia. Zobacz na przykład protokół SPDY, który wykorzystuje pojedyncze połączenie w celu poprawy czasów ładowania strony.
- TCP jest abstrakcją: nadal istnieje (zwykle) tylko jedno podstawowe połączenie. Tak więc, gdy używanych jest wiele żądań, dane przesyłane przewodowo niekoniecznie korzystają z wielu połączeń w celu poprawy prędkości.
- Połączenia internetowe są z natury zawodne, zwłaszcza na urządzeniach mobilnych. Jedno żądanie może zostać zakończone znacznie szybciej niż drugie. Korzystanie z wielu żądań CSS oznacza, że renderowanie strony internetowej jest blokowane do czasu zakończenia ostatniego żądania, co może być znacznie późniejsze niż przeciętne połączenie.
Czy jest więc jakaś korzyść z równoległego żądania HTTP dla plików CSS?
Uwaga / aktualizacja: wszystkie pliki CSS blokują renderowanie. Pliki CSS, które nie zostały jeszcze przeniesione poza ścieżkę krytyczną.
źródło
Odpowiedzi:
Pliki CSS połączone z dokumentami HTML są dodawane do równoległej kolejki pobierania podczas analizowania HTML; najważniejsze jest to, że niesynchroniczne łącza JavaScript blokują parser HTML, zapobiegając dodawaniu późniejszych znaczników do kolejki pobierania, dopóki JavaScript nie zostanie pobrany, przeanalizowany i wykonany. [1]
Oto przykład, który zmusza przeglądarkę do pobierania kolejno trzech z czterech plików (co najmniej trzy trasy w obie strony):
Oto przykład przerobiony, aby wszystkie 4 pliki były pobierane równolegle (co najmniej jedna podróż w obie strony):
Kolejna uwaga: pliki CSS (domyślnie) blokują renderowanie, a nie blokują parser; strona będzie nadal analizowana i konstruowany DOM, ale renderowanie nie rozpocznie się, dopóki nie zostanie zbudowana CSSOM.
Głównym powodem podzielenia twojego CSS jest uzyskanie minimalnych reguł niezbędnych do renderowania treści widocznej na ekranie dla klienta i parsowanie tak szybko, jak to możliwe. Pozostałe reguły dotyczące rzeczy, które nie są od razu widoczne, można oznaczyć jako niekoniecznie blokujące renderowanie za pomocą
media
zapytań w tagu link lub dodać do strony przez asynchronicznie załadowany JavaScript.Tak więc nie ma wyraźnej korzyści z równoległego pobierania plików CSS dla samej korzyści. Ale jak zawsze mierz i testuj!
Do dalszego czytania polecam te artykuły na temat „Podstawy sieci: Optymalizacja wydajności” od Google: https://developers.google.com/web/fundamentals/performance/
[1]: To ignoruje funkcję analizy spekulacyjnej w niektórych przeglądarkach:
https://docs.google.com/document/d/1JQZXrONw1RrjrdD_Z9jq1ZKsHguh8UVGHY_MZgE63II/preview?hl=en-GB&forcehl=1
https://developer.mozilla.org/en-US/docs/Web/HTML/Optimizing_your_pages_for_speculative_parsing
źródło