Wstępnie wczytuj najważniejsze zasoby, aby przyspieszyć wczytywanie

Gdy otwierasz stronę internetową, przeglądarka wysyła żądanie dokumentu HTML z serwera, analizuje jego zawartość i przesyła osobne żądania dotyczące wszystkich zasobów, do których się odwołuje. Jako deweloper wiesz już, jakich zasobów potrzebuje Twoja strona i które z nich są najważniejsze. Dzięki tej wiedzy możesz z wyprzedzeniem poprosić o kluczowe zasoby i przyspieszyć proces wczytywania. Z tego artykułu dowiesz się, jak to zrobić za pomocą <link rel="preload">.

Jak działa wstępny wczytywanie

Wstępne wczytywanie najlepiej nadaje się do zasobów, które przeglądarka zwykle odkrywa późno.

Zrzut ekranu panelu Sieć w Narzędziach deweloperskich w Chrome
W tym przykładzie czcionka Pacifico jest zdefiniowana w arkuszu stylów za pomocą reguły @font-face. Przeglądarka wczytuje plik czcionki dopiero po zakończeniu pobierania i analizowania arkusza stylów.

Wstępne wczytywanie określonego zasobu oznacza, że chcesz pobrać go wcześniej, niż przeglądarka mogłaby go wykryć, ponieważ wiesz, że jest on ważny dla bieżącej strony.

Zrzut ekranu przedstawiający panel Sieć w Narzędziach deweloperskich w Chrome po zastosowaniu wstępnego wczytania.
W tym przykładzie czcionka Pacifico jest wczytana wstępnie, więc pobieranie odbywa się równolegle z wczytywaniem arkusza stylów.

Łańcuch żądań krytycznych przedstawia kolejność zasobów, które są pobierane przez przeglądarkę z uwzględnieniem priorytetów. Lighthouse identyfikuje zasoby na trzecim poziomie tego łańcucha jako późno wykryte. Aby określić, które zasoby wstępnie wczytać, możesz użyć audytu Wstępnie wczytywanie żądań kluczy.

Audyt Lighthouse dotyczący wstępnego wczytywania żądań kluczy.

Zasoby możesz wstępnie wczytać, dodając do nagłówka dokumentu HTML tag <link> z wartością rel="preload":

<link rel="preload" as="script" href="critical.js">

Przeglądarka przechowuje w pamięci podręcznej załadowane zasoby, aby były dostępne od razu, gdy zajdzie taka potrzeba. (nie uruchamia skryptów ani nie stosuje arkuszy stylów).

Wskazówki dotyczące zasobów, np. preconnectprefetch, są wykonywane według uznania przeglądarki. Z kolei preload jest wymagane w przypadku przeglądarki. Nowoczesne przeglądarki dobrze radzą sobie z przydzielaniem priorytetów zasobom, dlatego ważne jest, aby używać preload oszczędnie i wstępnie wczytywać tylko najważniejsze zasoby.

Niewykorzystane wstępnie załadowane zasoby powodują wyświetlenie ostrzeżenia w konsoli Chrome około 3 sekund po zdarzeniu load.

Ostrzeżenie konsoli Narzędzi deweloperskich w Chrome dotyczące nieużywanych zasobów wstępnie załadowanych

Przypadki użycia

Wczytywanie wstępnie zasobów zdefiniowanych w CSS

Czcionki zdefiniowane za pomocą reguł @font-face lub obrazy tła zdefiniowane w plikach CSS nie są wykrywane, dopóki przeglądarka nie pobierze i nie przeanalizuje tych plików. Wstępne wczytywanie tych zasobów zapewnia, że są one pobierane przed pobraniem plików CSS.

Wstępne wczytywanie plików CSS

Jeśli używasz krytycznego kodu CSS, podziel kod CSS na dwie części. Krytyczny kod CSS wymagany do renderowania treści widocznych na ekranie bez przewijania jest wbudowany w <head> dokumentu, a mniej istotny kod CSS jest zwykle ładowany z opóźnieniem za pomocą JavaScript. Oczekiwanie na wykonanie kodu JavaScript przed załadowaniem niekrytycznego kodu CSS może powodować opóźnienia w renderowaniu podczas przewijania przez użytkowników, dlatego warto użyć atrybutu <link rel="preload">, aby szybciej rozpocząć pobieranie.

Wstępne wczytywanie plików JavaScript

Ponieważ przeglądarki nie wykonują wstępnie załadowanych plików, wstępny odczyt jest przydatny do oddzielenia pobierania od wykonania, co może poprawić wskaźniki takie jak Czas do interakcji. Wstępne wczytywanie działa najlepiej, jeśli podzielisz pakiety JavaScriptu i wstępnie wczytasz tylko najważniejsze fragmenty.

Jak zaimplementować rel=preload

Najprostszym sposobem implementacji preload jest dodanie tagu <link> do <head> dokumentu:

<head>
  <link rel="preload" as="script" href="critical.js">
</head>

Podanie atrybutu as pomaga przeglądarce ustawić priorytet zasobu pobieranego z poziomu pamięci podręcznej zgodnie z jego typem, ustawić odpowiednie nagłówki i określić, czy zasób znajduje się już w pamięci podręcznej. Akceptowane wartości tego atrybutu to: script, style, font, image i inne.

Niektóre typy zasobów, np. czcionki, są wczytywane w trybie anonimowym. W przypadku tych atrybutów musisz ustawić atrybut crossorigin na preload:

<link rel="preload" href="ComicSans.woff2" as="font" type="font/woff2" crossorigin>

Elementy <link> obsługują też atrybut type, który zawiera typ MIME powiązanego zasobu. Przeglądarki używają wartości atrybutu type, aby upewnić się, że zasoby są wstępnie wczytywane tylko wtedy, gdy ich typ pliku jest obsługiwany. Jeśli przeglądarka nie obsługuje określonego typu zasobu, zignoruje parametr <link rel="preload">.

Możesz też wstępnie wczytać dowolny typ zasobu za pomocą nagłówka HTTP Link:

Link: </css/style.css>; rel="preload"; as="style"

Zaletą podania wartości preload w nagłówku HTTP jest to, że przeglądarka nie musi analizować dokumentu, aby go wykryć, co w niektórych przypadkach może przynieść niewielkie ulepszenia.

Wstępne wczytywanie modułów JavaScript za pomocą webpack

Jeśli używasz narzędzia do tworzenia pakietów modułów, które tworzy pliki kompilacji aplikacji, sprawdź, czy obsługuje ono wstrzykiwanie tagów wstępnego wczytywania. W wersji webpack 4.6.0 lub nowszej wstępne wczytywanie jest obsługiwane za pomocą magicznych komentarzy w pliku import():

import(_/* webpackPreload: true */_ "CriticalChunk")

Jeśli używasz starszej wersji webpack, użyj wtyczki innej firmy, takiej jak preload-webpack-plugin.

Wpływ wstępnego ładowania na podstawowe wskaźniki internetowe

Wstępne wczytywanie to skuteczna optymalizacja wydajności, która wpływa na szybkość wczytywania. Takie optymalizacje mogą powodować zmiany w podstawowych wskaźnikach internetowych witryny. Warto o tym pamiętać.

Największe wyrenderowanie treści (LCP)

Wstępne wczytywanie ma duży wpływ na największe wyrenderowanie treści (LCP) w przypadku czcionek i obrazów, ponieważ zarówno obrazy, jak i węzły tekstowe mogą być kandydatami na LCP. Obrazy w centrum uwagi i duże fragmenty tekstu renderowane za pomocą czcionek internetowych mogą znacznie skorzystać z dobrze umieszczonego podpowiedzi wstępnego wczytania. Należy go wykorzystać, gdy istnieje możliwość szybszego dostarczenia tych ważnych treści użytkownikowi.

Należy jednak zachować ostrożność w przypadku wstępnego wczytywania i innych optymalizacji. Unikaj zwłaszcza wczytywania zbyt wielu zasobów. Jeśli priorytety mają zbyt wiele zasobów, żadne z nich nie będą miały priorytetu. Skutki nadmiernego korzystania z wskazówek dotyczących wstępnego wczytywania będą szczególnie niekorzystne w przypadku wolniejszych sieci, w których rywalizacja o przepustowość będzie bardziej widoczna.

Zamiast tego skup się na kilku zasobach o wysokiej wartości, które według Ciebie będą korzystać z dobrze umieszczonego wstępnego wczytania. Podczas wstępnego wczytywania czcionek upewnij się, że są one wyświetlane w formacie WOFF 2.0, aby zminimalizować czas wczytywania zasobów. Format WOFF 2.0 jest bardzo dobrze obsługiwany przez przeglądarki, więc używanie starszych formatów, takich jak WOFF 1.0 czy TrueType (TTF), opóźnia czas LCP, jeśli kandydat na LCP jest węzłem tekstowym.

W przypadku LCP i JavaScript musisz mieć pewność, że wysyłasz pełny znacznik z serwera, aby skaner wstępnego ładowania przeglądarki działał prawidłowo. Jeśli wyświetlasz treści, które do renderowania znaczników korzystają wyłącznie z JavaScriptu i nie możesz wysyłać kodu HTML renderowanego na serwerze, warto skorzystać z możliwości, których nie obsługuje skaner wstępnego wczytywania przeglądarki, i wstępnie wczytać zasoby, które w innej sytuacji byłyby dostępne dopiero po zakończeniu wczytywania i wykonywywania kodu JavaScriptu.

Skumulowane przesunięcie układu (CLS)

Kumulowana zmiana układu (CLS) to szczególnie ważny wskaźnik w przypadku czcionek internetowych. CLS ma duży wpływ na czcionki internetowe, które do zarządzania wczytywaniem czcionek używają właściwości font-display CSS. Aby zminimalizować zmiany układu związane z czcionką internetową, zastosuj te strategie:

  1. Wstępnie wczytaj czcionki, używając domyślnej wartości block dla font-display. To jest delikatna równowaga. Zablokowanie wyświetlania czcionek bez alternatywy może być uznane za problem związany z wygodą użytkowników. Z jednej strony wczytywanie czcionek za pomocą font-display: block; eliminuje przesunięcia układu związane z czcionkami internetowymi. Z drugiej strony, jeśli czcionki internetowe są kluczowe dla wygody użytkowników, warto, aby były wczytane jak najszybciej. Połączenie wstępnego wczytania z font-display: block; może być akceptowalnym kompromisem.
  2. Wstępnie wczytaj czcionki, używając wartości fallback dla atrybutu font-display. fallback to kompromis między swapblock, ponieważ ma bardzo krótki okres blokowania.
  3. Użyj wartości optional dla atrybutu font-display bez wstępnego wczytania. Jeśli czcionka internetowa nie jest kluczowa dla wygody użytkowników, ale jest używana do renderowania znacznej ilości tekstu na stronie, rozważ użycie wartości optional. W niesprzyjających warunkach optional wyświetli tekst strony w czcionce zastępczej, a w tle będzie wczytywać czcionkę na potrzeby następnej nawigacji. W przypadku tych warunków efektem netto jest lepszy wskaźnik CLS, ponieważ czcionki systemowe będą renderowane natychmiast, a przy kolejnych wczytaniach strony czcionka będzie wczytywana natychmiast bez zmian układu.

W przypadku czcionek internetowych CLS jest trudnym do optymalizacji wskaźnikiem. Jak zawsze, eksperymentuj w laboratorium, ale zaufaj danym z pola, aby określić, czy Twoje strategie ładowania czcionek poprawiają czy pogarszają CLS.

Interakcja do kolejnego wyrenderowania (INP)

Czas od interakcji do kolejnego wyrenderowania to dane, które mierzą responsywność na dane wprowadzane przez użytkownika. Większość interakcji w internecie jest obsługiwana przez JavaScript, więc wstępne wczytywanie kodu JavaScript, który obsługuje ważne interakcje, może pomóc w utrzymaniu niższego INP strony. Pamiętaj jednak, że wstępne wczytywanie zbyt dużej ilości kodu JavaScript podczas uruchamiania może mieć niezamierzone negatywne konsekwencje, jeśli zbyt wiele zasobów będzie rywalizować o przepustowość.

Uważnie rozważ też sposób dzielenia kodu. Dzielenie kodu to świetna optymalizacja, która pozwala zmniejszyć ilość wczytywanego podczas uruchamiania kodu JavaScript, ale interakcje mogą być opóźnione, jeśli polegają na kodzie JavaScript wczytywanym na początku interakcji. Aby to zrekompensować, musisz sprawdzić intencję użytkownika i przed rozpoczęciem interakcji wstrzyknąć do pamięci podręcznej niezbędne fragmenty kodu JavaScript. Przykładem może być wstępne wczytanie kodu JavaScript wymaganego do sprawdzania zawartości formularza, gdy użytkownik kliknie dowolne pole formularza.

Podsumowanie

Aby zwiększyć szybkość strony, przeładuj ważne zasoby, które są wykrywane przez przeglądarkę późno. Wczytywanie wszystkiego z zapasu nie przyniesie oczekiwanych rezultatów, dlatego używaj preload oszczędnie i mierz wpływ na podstawie rzeczywistych danych.