Jest wiele sposobów na poprawę wydajności sieci. Jednym z nich jest wstępne ładowanie treści, które będą potrzebne później. Wstępne przetwarzanie CSS, wstępne renderowanie całej strony lub rozpoznawanie nazw domen. Robimy wszystko z wyprzedzeniem, a następnie natychmiast wyświetlamy wynik! Brzmi nieźle.
Jeszcze fajniejsze jest to, że można go bardzo prosto zaimplementować. Pięć tagów wydaj przeglądarce polecenie wykonania wstępnych działań:
<link rel= "preload"> informuje przeglądarkę, aby jak najszybciej załadowała i buforowała zasób (taki jak skrypt lub arkusz stylów). Jest to przydatne, gdy zasób jest potrzebny kilka sekund po załadowaniu strony, a chcesz przyspieszyć ten proces.
Przeglądarka nie robi nic z zasobem po załadowaniu. Skrypty nie są wykonywane, arkusze stylów nie są stosowane. Zasób jest po prostu buforowany i natychmiast udostępniany na żądanie.
Domyślnie comic-sans.woff2 rozpocznie się ładowanie dopiero po pobraniu i przeanalizowaniu index.css. Aby uniknąć tak długiego czekania, możesz pobrać czcionkę wcześniej, korzystając z niej <link rel= "preload">:
Dzięki takiemu podejściu style niekrytyczne zaczną się ładować dopiero po uruchomieniu JavaScript, co może nastąpić kilka sekund po renderowaniu. Zamiast czekać, użyj JS <link rel= "preload">aby rozpocząć pobieranie wcześniej:
Nie nadużywaj wstępnego ładowania. Jeśli załadujesz wszystko po kolei, strona nie przyspieszy magicznie, a wręcz przeciwnie, uniemożliwi przeglądarce prawidłowe zaplanowanie swojej pracy.
Nie mylić z pobieraniem wstępnym. Nie używaj <link rel= "preload">, jeśli nie potrzebujesz zasobu natychmiast po załadowaniu strony. Jeśli będziesz go później potrzebować, na przykład na następną stronę, użyj go <link rel= "prefetch">.
szczegóły
To jest wymagany tag do wykonania przez przeglądarkę (jeśli ją obsługuje), w przeciwieństwie do wszystkich innych tagów związane z wstępnym ładowaniem. Przeglądarka musi pobrać zasób określony w <link rel="preload">. W innych przypadkach może zignorować wstępne ładowanie, na przykład jeśli działa na wolnym łączu.
Priorytety. Przeglądarki zazwyczaj przypisują różne priorytety różnym zasobom (stylom, skryptom, czcionkom itp.), aby najpierw załadować najważniejsze zasoby. W tym przypadku przeglądarka określa priorytet na podstawie atrybutu as. W przeglądarce Chrome możesz spojrzeć pełna tabela priorytetów.
prefetch
<link rel= "prefetch"> prosi przeglądarkę o pobranie i buforowanie zasobu (takiego jak skrypt lub arkusz stylów) w tle. Ładowanie odbywa się z niskim priorytetem, więc nie zakłóca ważniejszych zasobów. Jest to przydatne, jeśli zasób jest potrzebny na następnej stronie i chcesz go wcześniej zapisać w pamięci podręcznej.
Tutaj także przeglądarka po załadowaniu nie robi nic z zasobem. Skrypty nie są wykonywane, arkusze stylów nie są stosowane. Zasób jest po prostu buforowany i natychmiast udostępniany na żądanie.
Ważne jest, aby określić atrybut as - pomaga to przeglądarce prawidłowo ustalać priorytety i planować pobieranie.
Kiedy używać
Aby załadować zasoby z innych stron, jeśli potrzebujesz zasobu z innej strony i chcesz go wstępnie załadować, aby przyspieszyć renderowanie tej strony. Na przykład:
Masz sklep internetowy i 40% użytkowników opuszcza stronę główną, aby przejść do strony produktu. Używać <link rel= "prefetch">, ładowanie plików CSS i JS w celu renderowania stron produktów.
Masz aplikację jednostronicową, a różne strony ładują różne pakiety. Gdy użytkownik odwiedza stronę, mogą zostać wstępnie załadowane pakiety dla wszystkich stron, do których prowadzi.
Jest prawdopodobne, że tego tagu można bezpiecznie używać w dowolnym zakresie.. Przeglądarki zwykle planują pobieranie wstępne z najniższym priorytetem, więc nikomu to nie przeszkadza. Pamiętaj tylko, że pochłania to ruch użytkowników, co może kosztować.
Nie na pilne prośby. Nie używaj <link rel= "prefetch">, gdy zasób jest potrzebny w ciągu kilku sekund. W tym przypadku użyj <link rel= "preload">.
szczegóły
Opcjonalny znacznik. Przeglądarka nie ma obowiązku stosowania się do tej instrukcji, może ją zignorować np. w przypadku wolnego połączenia.
Priorytet w Chrome. W Chrome <link rel= "prefetch"> zwykle wykonywane z minimalnym priorytetem (patrz pełna tabela priorytetów), czyli po załadowaniu wszystkiego innego.
połączenie wstępne
<link rel= "preconnect"> prosi przeglądarkę o wcześniejsze połączenie się z domeną, jeśli chcesz przyspieszyć konfigurację połączenia w przyszłości.
Przeglądarka musi nawiązać połączenie, jeśli pobiera jakiekolwiek zasoby z nowej domeny strony trzeciej. Na przykład, jeśli ładuje czcionki Google, czcionki React z CDN lub żąda odpowiedzi JSON z serwera API.
Nawiązanie nowego połączenia trwa zwykle kilkaset milisekund. Robi się to raz, ale i tak wymaga czasu. Jeśli wcześniej nawiązałeś połączenie, zaoszczędzisz czas i szybciej pobierzesz zasoby z tej domeny.
href wskazuje nazwę domeny, dla której chcesz określić adres IP. Można określić z przedrostkiem (https://domain.com) lub bez niego (//domain.com).
Kiedy używać
Użyj dla domen, które będą wkrótce potrzebne aby pobrać stamtąd ważny styl, skrypt lub obraz, ale nie znasz jeszcze adresu URL zasobu. Na przykład:
Twoja aplikacja jest hostowana na my-app.com i wysyła żądania AJAX do api.my-app.com: Nie znasz z góry konkretnych zapytań, ponieważ są one tworzone dynamicznie z JS. Tutaj całkiem właściwe jest użycie tagu do wstępnego połączenia z domeną.
Twoja aplikacja jest hostowana na my-app.com i korzysta z czcionek Google. Pobiera się je w dwóch etapach: najpierw pobierany jest plik CSS z domeny fonts.googleapis.com, wówczas ten plik żąda czcionek za pomocą fonts.gstatic.com. Nie możesz wiedzieć, z jakiego konkretnego pliku czcionki pochodzą fonts.gstatic.com będziesz potrzebować do momentu załadowania pliku CSS, dlatego możemy wcześniej nawiązać jedynie wstępne połączenie.
Użyj tego tagu, aby przyspieszyć skrypt lub styl strony trzeciej ze względu na wcześniej nawiązane połączenie.
Nie nadużywaj. Nawiązanie i utrzymanie połączenia jest kosztowną operacją zarówno dla klienta, jak i serwera. Użyj tego tagu dla maksymalnie 4-6 domen.
szczegóły
Opcjonalny znacznik. Przeglądarka nie ma obowiązku stosowania się do tej instrukcji i może ją zignorować, np. jeśli nawiązano już wiele połączeń lub w innym przypadku.
Co obejmuje proces łączenia?. Aby połączyć się z każdą witryną, przeglądarka musi wykonać następujące czynności:
Rozdzielczość DNS. Znajdź adres IP serwera (216.58.215.78) dla określonej nazwy domeny (google.com).
Uścisk dłoni TCP. Wymiana pakietów (klient → serwer → klient) w celu zainicjowania połączenia TCP z serwerem.
Uzgadnianie TLS (tylko witryny HTTPS). Dwie rundy wymiany pakietów (klient → serwer → klient → serwer → klient) w celu zainicjowania bezpiecznej sesji TLS.
Uwaga: HTTP/3 ulepszy i przyspieszy mechanizm uzgadniania, ale do tego jeszcze daleko.
DNS-wstępne pobieranie
<link rel= "dns-prefetch"> prosi przeglądarkę o wcześniejsze rozpoznanie DNS domeny, jeśli będziesz się z nią wkrótce łączyć i chcesz przyspieszyć początkowe połączenie.
Przeglądarka musi określić adres IP domeny, jeśli będzie pobierać jakiekolwiek zasoby z nowej domeny strony trzeciej. Na przykład ładowanie czcionek Google, czcionek React z CDN lub żądanie odpowiedzi JSON z serwera API.
Dla każdej nowej domeny rozpoznawanie rekordów DNS trwa zwykle około 20–120 ms. Wpływa to jedynie na załadowanie pierwszego zasobu z danej domeny, ale i tak wprowadza opóźnienie. Jeśli wcześniej wykonamy rozpoznawanie DNS, zaoszczędzimy czas i szybciej załadujemy zasób.
href wskazuje nazwę domeny, dla której chcesz ustawić adres IP. Można określić z przedrostkiem (https://domain.com) lub bez niego (//domain.com).
Kiedy używać
Użyj dla domen, które będą wkrótce potrzebne aby pobrać stamtąd zasoby, o których przeglądarka nie wie wcześniej. Na przykład:
Twoja aplikacja jest hostowana na my-app.com i wysyła żądania AJAX do api.my-app.com: Nie znasz z góry konkretnych zapytań, ponieważ są one tworzone dynamicznie z JS. Tutaj całkiem właściwe jest użycie tagu do wstępnego połączenia z domeną.
Twoja aplikacja jest hostowana na my-app.comi korzysta z czcionek Google. Pobiera się je w dwóch etapach: najpierw pobierany jest plik CSS z domeny fonts.googleapis.com, wówczas ten plik żąda czcionek za pomocą fonts.gstatic.com. Nie możesz wiedzieć, z jakiego konkretnego pliku czcionki pochodzą fonts.gstatic.com będziesz go potrzebować do czasu załadowania pliku CSS, dlatego możemy z wyprzedzeniem nawiązać jedynie wstępne połączenie.
Użyj tego tagu, aby przyspieszyć skrypt lub styl strony trzeciej ze względu na wcześniej nawiązane połączenie.
Proszę zwrócić uwagę na podobne cechy do <link rel= "dns-prefetch"/> и <link rel= "preconnect">. Zwykle nie ma sensu używać ich razem dla jednej domeny: <link rel= "preconnect"> już zawiera <link rel= "dns-prefetch"/> i wiele więcej. Można to uzasadnić w dwóch przypadkach:
Czy chcesz obsługiwać starsze przeglądarki?. <link rel= "dns-prefetch" /> wspierany przez od IE10 i Safari 5. <link rel= "preconnect"> był przez jakiś czas obsługiwany w przeglądarkach Chrome i Firefox, ale został dodany do Safari dopiero w wersji 11.1 i nadal nie jest obsługiwany w IE/Edge. Jeśli potrzebujesz obsługi tych przeglądarek, użyj <link rel= "dns-prefetch" /> jako opcja kopii zapasowej dla <link rel= "preconnect">.
Chcesz przyspieszyć połączenia do więcej niż 4-6 domen. Etykietka <link rel= "preconnect"> Nie zaleca się używania więcej niż 4-6 domen, ponieważ ustanowienie i utrzymanie połączenia jest kosztowną operacją. <link rel= "dns-prefetch" /> zużywa mniej zasobów, więc używaj go w razie potrzeby.
szczegóły
Opcjonalny znacznik. Przeglądarka nie musi postępować zgodnie z tą instrukcją, dlatego może nie wykonać rozpoznawania DNS, jeśli na przykład na stronie znajduje się wiele takich tagów lub w innym przypadku.
Co to jest DNS. Każdy serwer w Internecie ma unikalny adres IP, który wygląda następująco 216.58.215.78. Nazwę witryny wpisuje się zazwyczaj w pasek adresu przeglądarki (np. google.com), a serwery DNS (Domain Name System) dopasowują go do adresu IP serwera (216.58.215.78).
Aby określić adres IP, przeglądarka musi wysłać zapytanie do serwera DNS. Łączenie z nową domeną strony trzeciej zajmuje 20–120 ms.
DNS jest buforowany, choć niezbyt niezawodny. Niektóre systemy operacyjne i przeglądarki buforują zapytania DNS: pozwoli to zaoszczędzić czas w przypadku powtarzających się zapytań, ale nie można polegać na buforowaniu. Na Linuksie zwykle w ogóle nie działa. Chrome ma pamięć podręczną DNS, ale działa ona tylko przez minutę. System Windows buforuje odpowiedzi DNS przez pięć dni.
renderowanie wstępne
<link rel= "prerender"> prosi przeglądarkę o pobranie adresu URL i wyświetlenie go w niewidocznej karcie. Gdy użytkownik kliknie w link, strona powinna zostać wyświetlona natychmiast. Jest to przydatne, jeśli masz pewność, że użytkownik odwiedzi daną stronę i chcesz przyspieszyć jej wyświetlenie.
Pomimo (lub z powodu) wyjątkowej skuteczności tego tagu, w 2019 r <link rel= "prerender"> słabo obsługiwane w głównych przeglądarkach. Zobacz więcej szczegółów. niżej.
href wskazuje adres URL, który chcesz rozpocząć renderowanie w tle.
Kiedy używać
Kiedy masz naprawdę pewność, że użytkownik przejdzie na określoną stronę. Jeśli masz „tunel”, przez który 70% odwiedzających stronę A przechodzi na stronę B, to wtedy <link rel= "prerender"> na stronie A pomoże bardzo szybko wyświetlić stronę B.
Nie nadużywaj. Wstępne renderowanie jest niezwykle kosztowne pod względem przepustowości i pamięci. Nie używaj <link rel= "prerender"> dla więcej niż jednej strony.
szczegóły
Opcjonalny znacznik. Przeglądarka nie musi przestrzegać tej instrukcji i może ją zignorować, na przykład w przypadku wolnego połączenia lub braku wystarczającej ilości wolnej pamięci.
Aby zaoszczędzić pamięć Chrome nie wykonuje pełnego renderowaniaI tylko wstępnie załaduj NoState. Oznacza to, że Chrome ładuje stronę i wszystkie jej zasoby, ale nie renderuje ani nie wykonuje kodu JavaScript.
Firefox i Safari w ogóle nie obsługują tego tagu. Nie narusza to specyfikacji, ponieważ przeglądarki nie muszą przestrzegać tej instrukcji; ale i tak smutno. Błąd implementacyjny Firefox jest otwarty od siedmiu lat. Istnieją doniesienia, że Safari również nie obsługuje tego tagu.
Streszczenie
Używać:
<link rel= "preload"> - gdy potrzebujesz zasobu w kilka sekund
<link rel= "prefetch"> - kiedy potrzebujesz zasobu na następnej stronie
<link rel= "preconnect"> - gdy wiesz, że wkrótce będziesz potrzebować zasobu, ale nie znasz jeszcze jego pełnego adresu URL
<link rel= "dns-prefetch"> - podobnie, gdy wiesz, że wkrótce będziesz potrzebował zasobu, ale nie znasz jeszcze jego pełnego adresu URL (dla starszych przeglądarek)
<link rel= "prerender"> — gdy masz pewność, że użytkownicy odwiedzą daną stronę, a chcesz przyspieszyć jej wyświetlanie