Po otwarciu strony internetowej przeglądarka wysyła do serwera żądanie udostępnienia dokumentu HTML, analizuje jego zawartość i przesyła osobne żądania dotyczące wszystkich przywołanych zasobów. Jako programista znasz już wszystkie zasoby potrzebne dla strony oraz to, które z nich są najważniejsze. Możesz wykorzystać tę wiedzę, aby z wyprzedzeniem poprosić o kluczowe zasoby i przyspieszyć proces wczytywania. Z tego posta dowiesz się, jak to zrobić dzięki <link rel="preload">
.
Jak działa wstępne wczytywanie
Wstępne wczytywanie najlepiej sprawdza się w przypadku zasobów zwykle wykrywanych z opóźnieniem przez przeglądarkę.
![Zrzut ekranu przedstawiający panel Sieć w Narzędziach deweloperskich w Chrome.](https://web.dev/static/articles/preload-critical-assets/image/screenshot-devtools-1.png?authuser=7&hl=pl)
@font-face
. Przeglądarka wczytuje plik czcionki dopiero po zakończeniu pobierania i analizy arkusza stylów.Wstępne wczytywanie określonego zasobu oznacza, że chcesz pobrać go wcześniej, niż gdyby przeglądarka mogła go wykryć. Masz pewność, że jest on ważny w przypadku bieżącej strony.
![Zrzut ekranu przedstawiający panel Sieć w Narzędziach deweloperskich w Chrome po zastosowaniu wstępnego wczytywania.](https://web.dev/static/articles/preload-critical-assets/image/screenshot-chrome-devtoo-debf067f48e5c.png?authuser=7&hl=pl)
Krytyczny łańcuch żądań reprezentuje kolejność zasobów, które są traktowane priorytetowo i pobierane przez przeglądarkę. Lighthouse identyfikuje komponenty na trzecim poziomie łańcucha jako takie, które zostały wykryte późno. Aby określić zasoby do wstępnego wczytania, możesz użyć kontroli Wstępne wczytywanie kluczowych żądań.
Aby wstępnie wczytywać zasoby, dodaj tag <link>
z nagłówkiem rel="preload"
w nagłówku dokumentu HTML:
<link rel="preload" as="script" href="critical.js">
Przeglądarka zapisuje w pamięci podręcznej wstępnie załadowane zasoby, dzięki czemu są one dostępne od razu, gdy są potrzebne. (nie wykonuje skryptów ani nie stosuje arkuszy stylów).
Wskazówki dotyczące zasobów, np. preconnect
i prefetch
, są wykonywane zgodnie z potrzebami przeglądarki. Z kolei dokument preload
jest wymagany przez przeglądarkę. Współczesne przeglądarki całkiem dobrze radzą sobie z ustalaniem priorytetów zasobów, dlatego używaj usługi preload
oszczędnie i wczytuj wcześniej tylko najbardziej kluczowe zasoby.
Nieużywane wstępne załadowania powodują wyświetlenie w Chrome ostrzeżenia w Konsoli Play, około 3 sekundy po zdarzeniu load
.
Przypadki użycia
Wstępne wczytywanie zasobów zdefiniowanych w CSS
Czcionki zdefiniowane za pomocą reguł @font-face
lub obrazy tła zdefiniowane w plikach CSS są wykrywane dopiero po pobraniu i przeanalizowaniu tych plików przez przeglądarkę. Wstępne wczytywanie tych zasobów daje pewność, że zostaną pobrane jeszcze przed pobraniem plików CSS.
Wstępne wczytywanie plików CSS
Jeśli stosujesz krytyczne podejście do CSS, dzielisz go na 2 części. Kluczowy kod CSS wymagany do wyrenderowania części strony widocznej na ekranie jest wbudowany w <head>
dokumentu, a niekrytyczny kod CSS jest zwykle leniwy ładowany przez kod JavaScript. Oczekiwanie na wykonanie kodu JavaScript przed wczytaniem niekrytycznego kodu CSS może spowodować opóźnienia w renderowaniu, gdy użytkownicy przewijają. Dlatego warto wcześniej użyć funkcji <link rel="preload">
, by rozpocząć pobieranie.
Wstępne wczytywanie plików JavaScript
Przeglądarki nie uruchamiają wstępnie wczytywanych plików, dlatego wstępne wczytywanie jest przydatne w odróżnieniu pobierania od wykonania, co może poprawić dane takie jak Czas do pełnej interaktywności. Wstępne wczytywanie działa najlepiej, gdy podzielisz pakiety JavaScript i wczytujesz wstępnie tylko te fragmenty o znaczeniu krytycznym.
Jak zaimplementować atrybut 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 wstępnie pobranego zasobu zgodnie z jego typem, ustawić odpowiednie nagłówki i ustalić, czy zasób istnieje już w pamięci podręcznej. Akceptowane wartości tego atrybutu to script
, style
, font
, image
i inne.
Niektóre typy zasobów, na przykład czcionki, są ładowane w trybie anonimowym. W przypadku tych podmiotów musisz ustawić atrybut crossorigin
za pomocą preload
:
<link rel="preload" href="ComicSans.woff2" as="font" type="font/woff2" crossorigin>
Elementy <link>
akceptują też atrybut type
, który zawiera typ MIME połączonego zasobu. Przeglądarki korzystają z wartości atrybutu type
, aby mieć pewność, że zasoby zostaną wstępnie wczytane tylko wtedy, gdy ich typ pliku jest obsługiwany. Jeśli przeglądarka nie obsługuje podanego typu zasobu, zignoruje <link rel="preload">
.
Możesz też wstępnie wczytywać dowolne zasoby za pomocą nagłówka HTTP Link
:
Link: </css/style.css>; rel="preload"; as="style"
Zaletą określenia 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 korzyści.
Wstępne wczytywanie modułów JavaScript za pomocą pakietu internetowego
Jeśli korzystasz z pakietu modułów, który tworzy pliki kompilacji aplikacji, sprawdź, czy obsługuje on wstrzykiwanie tagów wstępnego wczytywania. W przypadku pakietu webpack w wersji 4.6.0 lub nowszej obsługiwane jest wstępne ładowanie za pomocą magicznych komentarzy wewnątrz import()
:
import(_/* webpackPreload: true */_ "CriticalChunk")
Jeśli używasz starszej wersji pakietu internetowego, użyj wtyczki innej firmy, na przykład preload-webpack-plugin.
Wpływ wstępnego wczytywania na podstawowe wskaźniki internetowe
Wstępne wczytywanie to zaawansowana optymalizacja wydajności, która ma wpływ na szybkość wczytywania. Takie optymalizacje mogą spowodować zmiany w podstawowych wskaźnikach internetowych witryny, dlatego warto o nich pamiętać.
Największe wyrenderowanie treści (LCP)
Wstępne wczytywanie ma bardzo duży wpływ na największe wyrenderowanie treści (LCP), jeśli chodzi o czcionki i obrazy, ponieważ zarówno obrazy, jak i węzły tekstowe mogą być kandydatami LCP. Odpowiednio rozmieszczona podpowiedź wczytywania wstępnego i duże fragmenty tekstu renderowane za pomocą czcionek internetowych może znacznie poprawić skuteczność, dlatego należy ich używać, gdy tylko jest taka możliwość, aby szybciej dostarczyć użytkownikowi ważne informacje.
Musisz jednak zachować ostrożność podczas wstępnego wczytywania i innych optymalizacji. W szczególności unikaj wstępnego wczytywania zbyt wielu zasobów. Jeśli priorytety mają zbyt wiele zasobów, w rzeczywistości żaden z nich nie jest. Efekty nadmiernego wstępnego wczytywania będą szczególnie szkodliwe w przypadku wolniejszych sieci, w których rywalizacja o przepustowość jest bardziej zauważalna.
Zamiast tego skoncentruj się na kilku wartościowych zasobach, które mogą okazać się przydatne dzięki dobrze rozmieszczonemu wstępnemu załadowaniu. Podczas wstępnego wczytywania czcionek pamiętaj, aby używać ich w formacie WOFF 2.0, aby maksymalnie skrócić czas wczytywania zasobów. Ponieważ WOFF 2.0 doskonale obsługuje przeglądarki, używanie starszych formatów, takich jak WOFF 1.0 czy TrueType (TTF), opóźni LCP, jeśli kandydat LCP jest węzłem tekstowym.
W przypadku LCP i JavaScriptu warto upewnić się, że wysyłasz pełne znaczniki z serwera, by skaner wstępnego wczytywania przeglądarki działał prawidłowo. Jeśli wyświetlasz znaczniki w całości oparte na języku JavaScript i nie możesz wysyłać kodu HTML renderowanego przez serwer, warto zajrzeć w miejsce, w którym skaner wstępnego wczytywania nie może tego zrobić. W przeciwnym razie napotkasz zasoby, które w innym przypadku byłyby wykrywalne dopiero po zakończeniu wczytywania i wykonania JavaScriptu.
Skumulowane przesunięcie układu (CLS)
Skumulowane przesunięcie układu (CLS) jest szczególnie ważnym wskaźnikiem w przypadku czcionek internetowych. CLS w znacznym stopniu współdziała z czcionkami internetowymi, które używają właściwości CSS font-display
do zarządzania sposobem wczytywania czcionek. Aby zminimalizować wahania układu związane z czcionkami internetowymi, weź pod uwagę te strategie:
- Wstępnie wczytuj czcionki, używając domyślnej wartości
block
dla tekstufont-display
. To delikatna równowaga. Blokowanie wyświetlania czcionek bez funkcji zastępczej może być uznawane za problem związany z wrażeniami użytkownika. Z jednej strony wczytywanie czcionek za pomocą funkcjifont-display: block;
eliminuje przesunięcia związane z czcionkami internetowymi. Z drugiej strony chcesz, aby te czcionki internetowe wczytywały się jak najszybciej, jeśli są istotne dla wygody użytkowników. Dobrym rozwiązaniem może być połączenie wstępnego wczytywania z użyciem funkcjifont-display: block;
. - Wstępnie wczytuj czcionki, używając wartości
fallback
dla atrybutufont-display
.fallback
to kompromis międzyswap
ablock
, ponieważ ma bardzo krótki okres blokowania. - W przypadku
font-display
bez wstępnego wczytywania użyj wartościoptional
. Jeśli czcionka internetowa nie ma znaczenia dla wygody użytkowników, ale jest wykorzystywana do renderowania znacznej części tekstu na stronie, rozważ użycie wartościoptional
. W nieodpowiednich warunkachoptional
będzie wyświetlać tekst na stronie przy użyciu czcionki zastępczej, a jednocześnie wczytywać czcionkę w tle, aby umożliwić nawigację podczas następnej nawigacji. Efektem netto w tych warunkach jest ulepszony CLS, ponieważ czcionki systemowe będą renderowane natychmiast, a kolejne wczytania strony będą wczytywały czcionkę od razu bez przesunięć układu.
CLS jest trudnym wskaźnikiem do optymalizacji w przypadku czcionek internetowych. Jak zawsze, eksperymentuj w laboratorium, ale zaufaj danym zdobytym, aby ustalić, czy strategie wczytywania czcionek poprawiają CLS, czy je pogarszają.
Od interakcji do kolejnego wyrenderowania (INP)
Interakcja przed kolejnym wyrenderowaniem to wartość, która określa czas reakcji na dane wejściowe użytkownika. Ponieważ największy udział w interaktywności w internecie jest sterowany kodem JavaScript, wstępne wczytywanie kodu JavaScript, który jest podstawą ważnych interakcji, może pomóc w utrzymaniu niższego wskaźnika 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ść.
Zwróć też uwagę na sposób podziału kodu. Dzielenie kodu to znakomita optymalizacja, która ogranicza ilość kodu JavaScript ładowanego podczas uruchamiania, ale interakcje mogą być opóźnione, jeśli JavaScript jest wczytywany już na początku. Aby to zrekompensować, musisz zbadać intencje użytkownika i wstrzyknąć wstępne załadowanie niezbędnych fragmentów kodu JavaScript, zanim dojdzie do interakcji. Przykładem może być wstępne wczytywanie kodu JavaScript wymaganego do weryfikacji treści formularza, gdy dowolne z pól w formularzu jest zaznaczone.
Podsumowanie
Aby przyspieszyć wczytywanie, wczytuj wstępnie ważne zasoby, które przeglądarka wykryje z opóźnieniem. Wstępne wczytanie wszystkich informacji przyniesie efekt przeciwny do zamierzonego, dlatego używaj funkcji preload
oszczędnie i zmierz jej wpływ w świecie rzeczywistym.