Web Performance

Preload, prefetch i preconnect: kiedy każde z nich naprawdę pomaga

Resource hints są przydatne, gdy odpowiadają na rzeczywiste wąskie gardła przeglądarki. Używane na ślepo, dodają szum priorytetów i czasem spowalniają strony.

The Wux Webtools Team The Wux Webtools Team 11 min czytania Wspomagane przez AI, recenzowane przez ludzi
A simplified browser loading waterfall showing early resource hints for a web page.
Spis treści
  1. Resource hints nie są magią
  2. Co przeglądarka już robi dobrze
  3. Preload: dla zasobów bieżącej strony odkrywanych zbyt późno
  4. Preload i obrazy LCP
  5. Prefetch: dla następnej strony, nie tej
  6. Preconnect: dla kosztownych połączeń do ważnych originów
  7. DNS-prefetch: lżejszy kuzyn
  8. Jak zdecydować: praktyczny workflow
  9. 1. Zidentyfikuj wąskie gardło
  10. 2. Dodawaj po jednej wskazówce naraz
  11. 3. Sprawdź skutki uboczne priorytetów
  12. 4. Zweryfikuj nagłówki i cache
  13. Częste błędy
  14. Preload zbyt wielu rzeczy
  15. Używanie prefetch dla wymaganych zasobów
  16. Preconnect do każdej firmy trzeciej
  17. Zapominanie o warunkach mobilnych
  18. Prosta tabela decyzyjna
  19. Spokojna reguła

Resource hints nie są magią

preload, prefetch i preconnect są często traktowane jak lista kontrolna wydajności. Dodaj kilka tagów do <head>, uruchom ponownie Lighthouse, poczuj się lepiej. To nie tak działa.

Te wskazówki są instrukcjami dla potoku ładowania przeglądarki. Mogą pomóc, gdy wiesz coś, czego przeglądarka nie jest w stanie odkryć wystarczająco wcześnie. Mogą zaszkodzić, gdy zgadujesz, nadajesz zbyt wysoki priorytet pracy niekrytycznej albo rozgrzewasz połączenia, których użytkownicy nigdy nie będą potrzebować.

Krótka wersja:

  • Używaj preload dla zasobów wymaganych przez bieżącą stronę, ale odkrywanych zbyt późno.
  • Używaj prefetch dla prawdopodobnych zasobów przyszłej nawigacji, nie dla elementów niezbędnych na bieżącej stronie.
  • Używaj preconnect dla ważnych originów firm trzecich, gdzie zestawienie połączenia jest rzeczywistym opóźnieniem.

Praktyczne pytanie nie brzmi „która wskazówka jest najszybsza?”. Brzmi: „na co czeka przeglądarka i czy ta wskazówka może to oczekiwanie usunąć?”.

Co przeglądarka już robi dobrze

Nowoczesne przeglądarki nie są biernymi programami do pobierania plików. Parsują HTML, skanują z wyprzedzeniem w poszukiwaniu zasobów, przypisują priorytety, ponownie używają połączeń, opóźniają pracę, która nie jest widoczna, i dostosowują się do warunków sieciowych.

To oznacza, że resource hints powinny być selektywne. Jeśli arkusz stylów, skrypt, obraz albo font jest już odkrywany wcześnie i ma właściwy priorytet, dodanie wskazówki może nie zrobić nic. Co gorsza, może konkurować z zasobami, które mają większe znaczenie.

Zanim dodasz wskazówki, obejrzyj wykres waterfall w DevTools albo raport laboratoryjny. Jeśli używasz Lighthouse, zacznij od diagnostyki, a nie od wyniku; mamy osobny przewodnik o czytaniu raportu Lighthouse bez paniki — ale pamiętaj, że poprawny URL rozróżnia wielkość liter, więc w razie potrzeby użyj podlinkowanego artykułu z nawigacji swojej witryny.

Prawdziwe dowody zwykle widać w trzech miejscach:

  1. Krytyczny zasób startuje późno, ponieważ przeglądarka odkrywa go późno.
  2. Połączenie z ważnym originem zajmuje zauważalny czas przed pierwszym żądaniem.
  3. Zasób następnej strony jest bardzo przewidywalny i tani do pobrania w czasie bezczynności.

Jeśli żadna z tych rzeczy nie jest prawdziwa, wskazówka prawdopodobnie jest tylko dekoracją.

Preload: dla zasobów bieżącej strony odkrywanych zbyt późno

preload mówi przeglądarce: „Pobierz ten zasób teraz, ponieważ bieżąca strona będzie go potrzebować”.

Typowym przykładem jest font webowy wskazany wewnątrz CSS. Przeglądarka musi pobrać HTML, odkryć CSS, pobrać CSS, sparsować go, odkryć font, a dopiero potem zażądać fontu. Jeśli ten font jest ważny dla tekstu widocznego above-the-fold, odkrycie może nastąpić na tyle późno, że spowoduje przesunięcia układu albo opóźnione renderowanie tekstu.

Preload może przesunąć to żądanie wcześniej:

<link rel='preload' href='/fonts/inter-var.woff2' as='font' type='font/woff2' crossorigin>

Atrybut as ma znaczenie. Mówi przeglądarce, jakiego rodzaju jest to zasób, co wpływa na priorytet, cache, content security policy i nagłówki żądania. Fonty zwykle potrzebują też crossorigin, nawet gdy są serwowane z tej samej witryny, ponieważ pobieranie fontów używa trybu CORS.

Dobre kandydatury do preload to między innymi:

  • Główny font webowy używany do widocznego tekstu.
  • Obraz hero, który jest elementem Largest Contentful Paint i nie jest odkrywalny wcześnie.
  • Krytyczny plik CSS ładowany pośrednio.
  • Moduł lub skrypt potrzebny bardzo wcześnie, ale ukryty za innym skryptem.

Złe kandydatury do preload to między innymi:

  • Każda grubość fontu w design systemie.
  • Obrazy below-the-fold.
  • Skrypty, które nie są potrzebne do początkowego renderowania.
  • Zasoby, które przeglądarka już odkrywa w pierwszym fragmencie HTML.

Preload jest potężny, ponieważ wpływa na priorytet bieżącej strony. Z tego samego powodu łatwo go nadużyć. Jeśli preloadujesz pięć dużych zasobów, przestajesz pomagać przeglądarce. Zaczynasz się z nią spierać.

Fonty są klasycznym przypadkiem. Preload jednego głównego pliku fontu może pomóc. Preload sześciu grubości i kursyw zwykle pogarsza sytuację. Jeśli fonty są twoim wąskim gardłem, najpierw uporządkuj zestaw fontów; nasz przewodnik o tym, dlaczego fonty webowe nadal są najłatwiejszą wygraną wydajnościową na większości stron, opisuje to porządkowanie bardziej szczegółowo.

Preload i obrazy LCP

Preload obrazu LCP może być przydatny, gdy obraz nie jest widoczny w początkowym HTML. Częste przyczyny to obrazy tła w CSS, komponenty renderowane po stronie klienta albo logika obrazów responsywnych, która pojawia się późno.

Ale jeśli twój obraz hero jest już w HTML jako <img> z sensownym srcset, sizes, wymiarami i bez lazy loadingu, przeglądarka prawdopodobnie znajdzie go szybko. W takim przypadku dodanie fetchpriority='high' może być bardziej odpowiednie niż preload, zależnie od strony.

Dobry test: jeśli żądanie obrazu zaczyna się późno na wykresie waterfall i obraz staje się elementem LCP, rozważ preload. Jeśli zaczyna się wcześnie, ale pobiera wolno, problemem jest rozmiar, format, zachowanie CDN albo opóźnienie serwera — nie odkrywanie. W kwestii decyzji o formatach obrazów zobacz kiedy AVIF pokonuje WebP, a kiedy nie.

Prefetch: dla następnej strony, nie tej

prefetch mówi przeglądarce: „Ten zasób może być wkrótce potrzebny, ale nie jest wymagany teraz”.

To rozróżnienie jest ważne. Prefetch ma celowo niski priorytet. Przeglądarka może pobrać go w czasie bezczynności i zachować do późniejszego użycia. Może też pominąć go przy słabych połączeniach, w trybach oszczędzania danych albo pod presją pamięci.

Używaj prefetch, gdy intencja użytkownika jest wystarczająco silna, by następny zasób był prawdopodobny.

Dobre kandydatury do prefetch to między innymi:

  • Następny krok w wielostronicowym checkout.
  • Wyniki wyszukiwania po tym, jak użytkownik zacznie wpisywać zapytanie, jeśli następna trasa jest przewidywalna.
  • Strony dokumentacji podlinkowane ze spisu treści, gdy użytkownik aktywnie czyta pobliską treść.
  • Fragmenty tras w aplikacji single-page po najechaniu lub sfokusowaniu elementu nawigacji przez użytkownika.

Złe kandydatury do prefetch to między innymi:

  • Całe drzewo nawigacji.
  • Duże filmy albo galerie obrazów.
  • Skrypty firm trzecich „na wszelki wypadek”.
  • Strony, które użytkownicy rzadko odwiedzają jako następne.

Prefetch to obszar, w którym powściągliwość się opłaca. Zasób pobrany i nigdy nieużyty nie jest darmowy. Zużywa przepustowość, zasoby serwera, energię i potencjalnie dane użytkownika. W sieciach mobilnych pobieranie spekulacyjne może być aktywnie nieprzyjazne.

Dla wielu witryn najlepszą strategią prefetch jest strategia oparta na intencji. Nie pobieraj strony z cennikiem przez prefetch od razu po załadowaniu strony głównej. Zrób to, gdy użytkownik otworzy menu cennika, najedzie na link do cennika albo przewinie w pobliże call-to-action, które mocno przewiduje nawigację.

Pamiętaj też, że zachowanie przeglądarek się różni. Niektóre przeglądarki podchodzą do prefetch zachowawczo; część ustawień prywatności ogranicza albo wyłącza ładowanie spekulacyjne. Traktuj prefetch jako oportunistyczne usprawnienie, nie jako mechanizm poprawności.

Preconnect: dla kosztownych połączeń do ważnych originów

preconnect mówi przeglądarce: „Zacznij teraz zestawiać połączenie z tym originem”.

Może to obejmować wyszukiwanie DNS, połączenie TCP i negocjację TLS. Dla originów firm trzecich takie przygotowanie może zająć setki milisekund, zwłaszcza w sieciach o wysokiej latencji. Jeśli strona wkrótce potrzebuje krytycznego żądania z tego originu, preconnect może przyspieszyć późniejsze żądanie.

Przykład:

<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin>

Dobre kandydatury do preconnect to między innymi:

  • Origin fontów używany dla tekstu blokującego renderowanie.
  • Krytyczny origin API potrzebny podczas początkowej interakcji.
  • Origin CDN serwujący zasoby above-the-fold.
  • Dostawca płatności albo tożsamości potrzebny natychmiast po akcji użytkownika.

Złe kandydatury do preconnect to między innymi:

  • Endpointy analityczne i reklamowe, które nie są krytyczne dla użytkownika.
  • Originy używane tylko w niektórych sesjach.
  • Długie listy firm trzecich.
  • Zasoby z tego samego originu, gdzie przeglądarka już ma albo wkrótce otworzy połączenie.

Preconnect ma koszt utrzymania. Otwarte sockety zużywają pamięć i zasoby sieciowe. Przeglądarki zamykają nieużywane połączenia, ale to nie sprawia, że niepotrzebne preconnect są nieszkodliwe.

Przydatna reguła: używaj preconnect najwyżej do jednego lub dwóch originów firm trzecich o wysokiej pewności na stronie. Jeśli kusi cię, by dodać więcej, twoja architektura firm trzecich prawdopodobnie bardziej wymaga przeglądu niż twoje wskazówki wymagają rozbudowy.

DNS-prefetch: lżejszy kuzyn

Możesz też spotkać dns-prefetch:

<link rel='dns-prefetch' href='https://example-cdn.com'>

To tylko rozwiązuje nazwę domeny. Nie otwiera połączenia TCP ani TLS. Jest tańsze niż preconnect, ale też mniej pomocne.

DNS-prefetch może być rozsądny dla originów firm trzecich o niższej pewności, gdzie pełny preconnect wydaje się zbyt agresywny. W praktyce, jeśli origin jest krytyczny i na pewno będzie wkrótce użyty, wybierz preconnect. Jeśli jest jedynie możliwy, użyj DNS-prefetch albo nie rób nic.

Jak zdecydować: praktyczny workflow

Zacznij od pomiaru, nie od tagów.

1. Zidentyfikuj wąskie gardło

Otwórz trace wydajnościowy i poszukaj późnego odkrywania. Czy żądanie fontu, obrazu hero albo skryptu zaczęło się dopiero po pobraniu i sparsowaniu innego pliku? To kandydat do preload.

Jeśli żądanie zaczyna się dopiero po długim zestawianiu DNS/TCP/TLS do originu firmy trzeciej, to kandydat do preconnect.

Jeśli bieżąca strona działa dobrze, ale następna nawigacja jest przewidywalnie wolna, prefetch może pomóc.

2. Dodawaj po jednej wskazówce naraz

Resource hints wchodzą ze sobą w interakcje. Dodaj jedną, przetestuj ją i zostaw tylko wtedy, gdy waterfall się poprawia, a metryki widoczne dla użytkownika się nie pogarszają.

W przypadku preload obserwuj, czy wskazany zasób rzeczywiście jest szybko używany. Chrome może ostrzec, gdy zasób pobrany przez preload nie zostanie użyty krótko po załadowaniu. Traktuj to ostrzeżenie poważnie.

3. Sprawdź skutki uboczne priorytetów

Preload może odciągnąć przepustowość od CSS, JavaScriptu albo obrazów, które mają większe znaczenie. Preconnect może zająć slot połączenia. Prefetch może dodać ruch w tle.

Właściwy rezultat to nie „wskazany plik startuje wcześniej”. Właściwy rezultat to „strona staje się odczuwalnie lepsza dla użytkowników”. Patrz na LCP, INP, CLS i, gdy to możliwe, monitoring rzeczywistych użytkowników.

4. Zweryfikuj nagłówki i cache

Wskazówki mogą być wysyłane w HTML albo w nagłówkach HTTP Link. Nagłówki są przydatne, gdy serwer wcześnie wie, czego strona będzie potrzebować, ale trudniej je pobieżnie sprawdzić. Jeśli debugujesz, czy wskazówka rzeczywiście jest obecna na produkcji, surowe nagłówki mają znaczenie; to dokładnie taki przypadek, jaki opisuje nasz przewodnik po debugowaniu przekierowań i nagłówków HTTP.

Cache również ma znaczenie. Preload zasobu z niedopasowanymi credentials, błędnym as albo innymi parametrami URL może spowodować podwójne pobranie. To jeden z najczęstszych sposobów, w jaki preload dodany w dobrej wierze staje się błędem wydajnościowym.

Częste błędy

Preload zbyt wielu rzeczy

Jeśli wszystko jest krytyczne, nic nie jest. Ogranicz preload do zasobów potrzebnych do początkowego renderowania albo natychmiastowej interaktywności. Typowa strona powinna mieć od zera do trzech preloadów, nie dwadzieścia.

Używanie prefetch dla wymaganych zasobów

Prefetch ma niski priorytet i jest opcjonalny. Nie używaj go dla zasobów wymaganych przez bieżącą stronę. Jeśli strona potrzebuje czegoś teraz, rozważ preload albo normalne odkrywanie w HTML.

Preconnect do każdej firmy trzeciej

Strony obciążone firmami trzecimi często mają dziesięć albo więcej zewnętrznych originów. Preconnect do wszystkich tworzy szum. Wybierz jeden lub dwa, które są jednocześnie krytyczne i przewidywalnie używane.

Zapominanie o warunkach mobilnych

Resource hints są najcenniejsze na wolniejszych połączeniach, ale tam są też najbardziej niebezpieczne. Zmarnowany prefetch na szybkim połączeniu desktopowym to błąd zaokrąglenia. Na ograniczonym planie mobilnym to zły kompromis.

Prosta tabela decyzyjna

| Sytuacja | Najlepsza wskazówka | Dlaczego | |---|---:|---| | Krytyczny font odkrywany przez CSS | preload | Bieżąca strona go potrzebuje, odkrycie jest późne | | Obraz hero ukryty za CSS albo renderowaniem po stronie klienta | preload | Może poprawić LCP, jeśli obraz startuje późno | | Prawdopodobna następna trasa po intencji użytkownika | prefetch | Pomaga przyszłej nawigacji bez blokowania bieżącej strony | | Krytyczny origin fontów/API firmy trzeciej | preconnect | Usuwa zestawianie połączenia ze ścieżki krytycznej | | Możliwy, ale niepewny origin firmy trzeciej | dns-prefetch albo nic | Niższy koszt, niższa pewność | | Obraz below-the-fold | brak | Pozwól działać lazy loadingowi i priorytetom przeglądarki |

Spokojna reguła

Resource hints działają najlepiej, gdy są nudne i konkretne. Jeden font. Jeden obraz LCP. Jeden ważny origin firmy trzeciej. Jedna prawdopodobna następna trasa po intencji.

Działają słabo, gdy są używane jako optymizm: może użytkownik będzie tego potrzebować, może przeglądarka powinna pobrać tamto, może więcej wskazówek oznacza większą szybkość.

Przeglądarki już agresywnie optymalizują. Twoim zadaniem nie jest mikrozarządzanie każdym żądaniem. Twoim zadaniem jest skorygowanie tych kilku przypadków, w których przeglądarce brakuje informacji we właściwym momencie.

Najczęściej zadawane pytania

Czy powinienem preloadować wszystkie fonty?
Nie. Preloaduj tylko pliki fontów potrzebne dla widocznego tekstu wcześnie na stronie. Preload każdej grubości i stylu zwykle marnuje przepustowość i może opóźnić ważniejsze zasoby.
Czy prefetch jest bezpieczny dla każdego linku wewnętrznego?
Zwykle nie. Może tworzyć niepotrzebny ruch w tle i marnować dane użytkownika. Preferuj prefetch oparty na intencji, na przykład po hover, focus, otwarciu menu albo przewidywalnym następnym kroku.
Jaka jest różnica między preconnect a dns-prefetch?
Preconnect wykonuje DNS, TCP i TLS setup dla originu. DNS-prefetch tylko rozwiązuje nazwę domeny. Preconnect jest silniejszy, ale droższy, więc powinien być używany z większą pewnością.
Czy resource hints mogą poprawić Core Web Vitals?
Tak, szczególnie LCP, gdy naprawiają późne odkrywanie albo zestawianie połączenia dla krytycznego zasobu. Nie pomogą, jeśli prawdziwym problemem są zbyt duże zasoby, wolna odpowiedź serwera, kod blokujący renderowanie albo słabe cache’owanie.
Czy resource hints należy dodawać w HTML czy w nagłówkach HTTP?
Oba podejścia mogą działać. HTML łatwiej analizować dla wskazówek specyficznych dla strony. Nagłówki HTTP Link mogą być przydatne, gdy serwer zna krytyczne zasoby, zanim HTML zostanie sparsowany, ale wymagają starannego testowania, aby uniknąć duplikatów albo nieaktualnych wskazówek.

Źródła i dalsza lektura

  1. MDN: rel=preload
  2. MDN: Resource hints
  3. web.dev: Preconnect and DNS-prefetch
  4. W3C: Resource Hints
O autorze
The Wux Webtools Team

Ostatnia aktualizacja:

Czytaj dalej