W ostatnim czasie w jednym projekcie miałem za zadanie usprawnić działanie strony. Musiałem poprawić metryki Core Web Vitals. Wiązało się to ze sporym rozeznaniem w temacie, testami i analizą strony. Jedną z rzeczy, która pomogła osiągnąć ten sukces był tytułowy rel="preload".
Jak działa rel="preload"?
Zanim przejdziemy do szczegółów, to dowiedzmy się jak na prawdę działa ten atrybut, bo programiści mają problem ze zrozumiem tego.
Wartość wstępnego ładowania (ang. preload) atrybutu rel w elemencie <link> umożliwia zadeklarowanie konkretnych zasobów naszej które będą potrzebne do wyświetlenia (ang. render) naszej strony. Dzięki temu są one dostępne nieco wcześniej i rzadziej blokują renderowanie strony, a to pozytywniej wpływa na wydajność. Mimo, że nazwa zawiera ładowanie (ang. load), to nic nie jest ładowanie i wykonywane przez przeglądarkę. To co dzieje się na prawdę, to planowanie pobierania i buforowania z wyższym priorytetem.
W praktyce należy samemu wybrać odpowiednie pliki do szybszego załadowania. Nie tutaj ogólnej zasady.
Klasyczne użycie elementu <link> wygląda następująco:
<link rel="stylesheet" href="main.css" />
Teraz zamienimy powyższy kawałek kodu w taki sposób, by używał rel="preload". Aby wykorzystać maksymalnie jego możliwości musimy dodatkowo zdefiniować następujące atrybuty:
- Ścieżkę do zasobu za pomocą atrybutu
href. - Typ zasobu za pomocą atrybutu
as.
W praktyce będzie to wyglądało tak:
<link rel="preload" href="style.css" as="style" /> <link rel="preload" href="main.js" as="script" />
Myślę, że powyższy kod jest w miarę czytelny i zrozumiały. Pliki style.css i main.js będziemy ładować szybciej odpowiednio jako arkusz stylów oraz skrypt.
preload ma również inne zalety. Użycie as w celu określenia rodzaju treści, które mają być wstępnie załadowane, pozwala przeglądarce:
- Dokładniej ustalić priorytety ładowania zasobów.
- Przechowywać w pamięci podręcznej dany zasób w razie przyszłych żądań.
- Zastosować odpowiednią politykę bezpieczeństwa treści (ang. Content Security Policy) dla zasobu.
- Ustawić dla niego prawidłowe nagłówki żądania
Accept.
Jak widzimy powyżej, im bardziej opiszemy zasób, by szybciej przeglądarka go przetworzy i wykorzysta.
Jaki typy plików mogą być wcześniej ładowanie (ang. preloaded)?
audio: Pliki z muzyką, których normalnie użyjesz w elemencie<audio>.document: Dokument HTML który może zostać osadzony w<frame>lub<iframe>.embed: Zasób do osadzenia w elemencie<embed>.fetch: Zasób, do którego można uzyskać dostęp za pomocąfetce, np. plik JSON.font: Plik z czcionką.image: Obrazek.object: Zasób do osadzenia w elemencie<object>.script: Plik JavaScript.style: Arkusz stylów CSS.track: Plik WebVTT.worker: Plik JavaScript z web workerem lub shared workered.video: Plik wideo, który będzie osadzony w<video>.
Ile można przyspieszyć stronę dodać odpowiednie rel="preload"?
To jest bardzo dobre, a zarazem trudne, pytanie. Wszystko zależy od wielkości projektów i jego złożoności. Bazując na swoim doświadczeniu i projektach jakie realizowałem, to śmiało mogę podać, że można przyspieszyć stronę od 100 ms do nawet 2 sekund!