Optymalizacja czcionek internetowych pod kątem Core Web Vitals
W tym dokumencie omawiamy sprawdzone metody optymalizacji czcionek pod kątem wydajności. Czcionki internetowe mogą wpływać na wydajność na różne sposoby:
- Opóźnione renderowanie tekstu: jeśli czcionka internetowa nie została wczytana, przeglądarki zwykle opóźniają renderowanie tekstu. W wielu sytuacjach opóźnia to pierwsze wyrenderowanie treści (FCP). W niektórych sytuacjach opóźnia to największe wyrenderowanie treści (LCP).
- Przesunięcia układu: praktyka zamiany czcionek może powodować przesunięcia układu i wpływać na skumulowane przesunięcie układu (CLS). Te przesunięcia układu występują, gdy czcionka internetowa i jej czcionka zastępcza zajmują na stronie różne ilości miejsca.
Ten dokument składa się z 3 sekcji: wczytywanie czcionek, dostarczanie czcionek i renderowanie czcionek. Każda sekcja wyjaśnia, jak działa dany aspekt cyklu życia czcionki, i zawiera odpowiednie sprawdzone metody.
Wczytywanie czcionek
Czcionki są ważnymi zasobami. Bez nich użytkownik może nie być w stanie wyświetlić treści strony. Dlatego sprawdzone metody wczytywania czcionek koncentrują się na tym, aby czcionki były wczytywane jak najwcześniej. Szczególną uwagę należy zwrócić na czcionki wczytywane z witryn zewnętrznych, ponieważ pobieranie tych plików czcionek wymaga oddzielnych konfiguracji połączeń.
Jeśli nie masz pewności, czy czcionki na stronie są wczytywane na czas, sprawdź kartę Timing (Czas) w panelu Network (Sieć) w Narzędziach deweloperskich w Chrome.

Informacje o @font-face
Zanim przejdziesz do sprawdzonych metod wczytywania czcionek, warto dowiedzieć się
jak @font-face działa
i jak wpływa to na wczytywanie czcionek.
Deklaracja @font-face
jest niezbędnym elementem pracy z dowolną czcionką internetową. Deklaruje ona co najmniej nazwę używaną do odwoływania się do czcionki i wskazuje lokalizację odpowiedniego pliku czcionki.
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
Powszechnym błędnym przekonaniem jest to, że czcionka jest żądana po napotkaniu deklaracji @font-face. To nieprawda. Sama deklaracja @font-face nie powoduje pobrania czcionki. Czcionka jest pobierana tylko wtedy, gdy odwołuje się do niej styl używany na stronie. Na przykład:
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
h1 {
font-family: "Open Sans"
}
W tym przykładzie Open Sans zostanie pobrana tylko wtedy, gdy strona będzie zawierać element
<h1>.
Dlatego podczas optymalizacji czcionek należy poświęcić arkuszom stylów tyle samo uwagi co plikom czcionek. Zmiana zawartości lub sposobu dostarczania arkuszy stylów może mieć znaczący wpływ na czas wczytywania czcionek. Podobnie usunięcie nieużywanego kodu CSS i podzielenie arkuszy stylów może zmniejszyć liczbę czcionek wczytywanych przez stronę.
Deklaracje czcionek w tekście
Większość witryn odniesie duże korzyści z umieszczenia deklaracji czcionek i innych
krytycznych stylów w sekcji <head> dokumentu głównego, a nie z umieszczenia ich
w zewnętrznym arkuszu stylów. Dzięki temu przeglądarka może szybciej wykryć deklaracje czcionek, ponieważ nie musi czekać na pobranie zewnętrznego arkusza stylów.
<head>
<style>
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
body {
font-family: "Open Sans";
}
...etc.
</style>
</head>
Umieszczanie w tekście krytycznego kodu CSS może być bardziej zaawansowaną techniką, której nie wszystkie witryny mogą używać. Korzyści z wydajności są oczywiste, ale wymaga to dodatkowych procesów i narzędzi do kompilacji, aby zapewnić, że niezbędny kod CSS, a najlepiej tylko krytyczny kod CSS, jest prawidłowo umieszczony w tekście, a wszelki dodatkowy kod CSS jest dostarczany w sposób nieblokujący renderowania.
Wstępne łączenie z krytycznymi źródłami zewnętrznymi
Jeśli Twoja witryna wczytuje czcionki z witryny zewnętrznej, zdecydowanie zalecamy, aby
użyć wskazówki dotyczącej zasobów preconnect
, aby wcześniej nawiązać połączenie ze źródłem zewnętrznym.
Wskazówki dotyczące zasobów powinny znajdować się w sekcji <head> dokumentu. Ta wskazówka dotycząca zasobów konfiguruje połączenie do wczytywania arkusza stylów czcionki.
<head>
<link rel="preconnect" href="https://fonts.com">
</head>
Aby wstępnie połączyć połączenie używane do pobierania pliku czcionki, dodaj oddzielną wskazówkę dotyczącą zasobów preconnect, która używa atrybutu crossorigin.
W przeciwieństwie do arkuszy stylów pliki czcionek muszą być wysyłane przez połączenie
CORS.
<head>
<link rel="preconnect" href="https://fonts.com">
<link rel="preconnect" href="https://fonts.com" crossorigin>
</head>
Gdy używasz wskazówki dotyczącej zasobów preconnect, pamiętaj, że dostawca czcionek może udostępniać arkusze stylów i czcionki z różnych źródeł. Oto na przykład, jak używać wskazówki dotyczącej zasobów preconnect w przypadku Google Fonts.
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>
Zachowaj ostrożność podczas używania preload do wczytywania czcionek
Chociaż preload jest bardzo skuteczny w wykrywaniu czcionek na wczesnym etapie procesu wczytywania strony, odbywa się to kosztem zabierania zasobów przeglądarki z wczytywania innych zasobów.
Umieszczanie w tekście deklaracji czcionek i dostosowywanie arkuszy stylów może być skuteczniejszym rozwiązaniem. Te zmiany są bliższe rozwiązaniu głównej przyczyny późnego wykrywania czcionek, a nie tylko obejściem problemu.
Ponadto należy ostrożnie używać preload jako strategii wczytywania czcionek, ponieważ pomija ona niektóre wbudowane w przeglądarkę strategie negocjacji treści. Na przykład preload ignoruje deklaracje unicode-range i, jeśli jest używany rozważnie, powinien być używany tylko do wczytywania jednego formatu czcionki.
Jednak w przypadku korzystania z zewnętrznych arkuszy stylów wstępne wczytywanie najważniejszych czcionek może być bardzo skuteczne, ponieważ w przeciwnym razie przeglądarka nie wykryje, czy czcionka jest potrzebna, aż do znacznie późniejszego etapu.
Dostarczanie czcionek
Szybsze dostarczanie czcionek przyspiesza renderowanie tekstu. Ponadto, jeśli czcionka zostanie dostarczona wystarczająco wcześnie, może to pomóc wyeliminować przesunięcia układu wynikające z zamiany czcionek.
Używanie czcionek hostowanych samodzielnie
Teoretycznie używanie czcionki hostowanej samodzielnie powinno zapewnić lepszą wydajność, ponieważ eliminuje konfigurację połączenia z zewnętrznym źródłem. W praktyce różnice w wydajności między tymi 2 opcjami są mniej wyraźne. Na przykład Web Almanac stwierdził, że witryny używające czcionek zewnętrznych renderują się szybciej niż czcionki używające czcionek własnych.
Jeśli rozważasz używanie czcionek hostowanych samodzielnie, sprawdź, czy Twoja witryna korzysta z sieci dostarczania treści (CDN) i protokołu HTTP/2. Bez tych technologii jest znacznie mniej prawdopodobne, że czcionki hostowane samodzielnie zapewnią lepszą wydajność.
Jeśli używasz czcionki hostowanej samodzielnie, zalecamy też zastosowanie niektórych optymalizacji plików czcionek, które dostawcy czcionek zewnętrznych zwykle zapewniają automatycznie. Na przykład podział czcionek i kompresja WOFF2. Wymagany nakład pracy na zastosowanie tych optymalizacji zależy nieco od języków obsługiwanych przez Twoją witrynę. Pamiętaj, że optymalizacja czcionek pod kątem języków CJK może być szczególnie trudna.
Używanie WOFF2
Spośród nowoczesnych czcionek WOFF2 jest najnowsza, ma najszerszą obsługę przeglądarek i oferuje najlepszą kompresję. Ponieważ używa Brotli, WOFF2 kompresuje o 30% lepiej niż WOFF, co oznacza mniejszą ilość danych do pobrania, a tym samym większą wydajność.
Biorąc pod uwagę obsługę przeglądarek, eksperci zalecają teraz używanie tylko WOFF2:
Uważamy, że nadszedł czas, aby ogłosić: używaj tylko WOFF2 i zapomnij o wszystkim innym.
Bram Stein, z Web Almanac 2022
Uprości to Twój kod CSS i przepływ pracy oraz zapobiegnie przypadkowemu podwójnemu lub nieprawidłowemu pobieraniu czcionek. WOFF2 jest teraz obsługiwany wszędzie. Dlatego, jeśli nie musisz obsługiwać naprawdę starych przeglądarek, używaj tylko WOFF2. Jeśli nie możesz tego zrobić, rozważ, aby w ogóle nie udostępniać czcionek internetowych w tych starszych przeglądarkach. Nie będzie to problem, jeśli masz solidną strategię awaryjną. Odwiedzający korzystający ze starszych przeglądarek zobaczą Twoje czcionki zastępcze.
Podział czcionek
Pliki czcionek zwykle zawierają dużą liczbę glifów dla wszystkich obsługiwanych znaków. Możesz jednak nie potrzebować wszystkich znaków na stronie i możesz zmniejszyć rozmiar plików czcionek, dzieląc czcionki.
Deskryptor unicode-range
w deklaracji @font-face informuje przeglądarkę, do których znaków
można używać czcionki.
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
unicode-range: U+0025-00FF;
}
Plik czcionki jest pobierany, jeśli strona zawiera co najmniej 1 znak pasujący do zakresu Unicode. unicode-range jest zwykle używany do udostępniania różnych plików czcionek w zależności od języka używanego w treści strony.
unicode-range jest często używany w połączeniu z techniką podziału.
Podzielona czcionka zawiera mniejszą część glifów, które znajdowały się w oryginalnym pliku czcionki. Na przykład zamiast udostępniać wszystkie znaki wszystkim użytkownikom, witryna może generować oddzielne podzielone czcionki dla znaków łacińskich i cyrylicy.
Liczba glifów na czcionkę może się znacznie różnić:
- Czcionki łacińskie mają zwykle od 100 do 1000 glifów na czcionkę.
- CJK mogą mieć ponad 10 tys. znaków.
Usunięcie nieużywanych glifów może znacznie zmniejszyć rozmiar pliku czcionki.
Niektórzy dostawcy czcionek mogą automatycznie udostępniać różne wersje plików czcionek z różnymi podzbiorami. Na przykład Google Fonts robią to domyślnie:
/* devanagari */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJbecnFHGPezSQ.woff2) format('woff2');
unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* latin-ext */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJnecnFHGPezSQ.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
Podczas przechodzenia na samodzielne hostowanie można pominąć tę optymalizację, co może prowadzić do większych plików czcionek lokalnie.
Jeśli dostawca czcionek na to pozwala, możesz ręcznie podzielić czcionki za pomocą interfejsu
API (Czcionki Google obsługują to, udostępniając parametr textparametr)
lub ręcznie edytując pliki czcionek, a następnie hostując je samodzielnie. Narzędzia do
generowania podzbiorów czcionek to m.in. subfont i
glyphanger.
Zawsze sprawdzaj licencje czcionek, aby upewnić się, że zezwalają one na podział i samodzielne hostowanie.
Używanie mniejszej liczby czcionek internetowych
Najszybsza czcionka do dostarczenia to czcionka, która nie jest w ogóle żądana. Czcionki systemowe i czcionki zmienne to 2 sposoby na potencjalne zmniejszenie liczby czcionek internetowych używanych w Twojej witrynie.
Czcionka systemowa to domyślna czcionka używana przez interfejs użytkownika urządzenia. Czcionki systemowe zwykle różnią się w zależności od systemu operacyjnego i jego wersji. Ponieważ czcionka jest już zainstalowana, nie trzeba jej pobierać. Czcionki systemowe mogą szczególnie dobrze sprawdzać się w przypadku tekstu głównego.
Aby użyć czcionki systemowej w CSS, wpisz system-ui jako rodzinę czcionek:
font-family: system-ui
Ideą czcionek zmiennych jest to, że pojedyncza
czcionka zmienna może zastąpić wiele plików czcionek. Czcionki zmienne
działają przez zdefiniowanie "domyślnego" stylu czcionki i udostępnienie
"osi" do manipulowania czcionką.
Na przykład czcionka zmienna z osią Weight może służyć do implementowania liter, które wcześniej wymagałyby oddzielnych czcionek dla stylów light, regular, bold i extra bold.
Nie każdy skorzysta na przejściu na czcionki zmienne. Czcionki zmienne zawierają wiele stylów, dlatego zwykle mają większe rozmiary plików niż pojedyncze czcionki niezmienne, które zawierają tylko 1 styl. Największą poprawę dzięki użyciu czcionek zmiennych odnotują witryny, które używają (i muszą używać) różnych stylów i grubości czcionek.
Renderowanie czcionek
Gdy przeglądarka napotka czcionkę internetową, która nie została jeszcze wczytana, staje przed dylematem: czy ma wstrzymać renderowanie tekstu do czasu wczytania czcionki internetowej? Czy ma renderować tekst w czcionce zastępczej do czasu wczytania czcionki internetowej?
Różne przeglądarki różnie radzą sobie z tym scenariuszem. Domyślnie przeglądarki oparte na Chromium i Firefox blokują renderowanie tekstu na maksymalnie 3 sekundy, jeśli powiązana czcionka internetowa nie została wczytana. Safari blokuje renderowanie tekstu na czas nieokreślony.
To zachowanie można skonfigurować za pomocą atrybutu font-display. Ten wybór może mieć znaczące konsekwencje: font-display może wpływać na LCP, FCP i stabilność układu.
Wybór odpowiedniej strategii font-display
font-display
informuje przeglądarkę, jak ma postępować z renderowaniem tekstu, gdy powiązana czcionka internetowa nie została wczytana. Jest ona zdefiniowana dla każdej czcionki.
@font-face {
font-family: Roboto, Sans-Serif
src: url(/fonts/roboto.woff) format('woff'),
font-display: swap;
}
Istnieje 5 możliwych wartości font-display:
| Wartość | Okres blokowania | Okres zamiany |
|---|---|---|
| Automatycznie | Zależy od przeglądarki | Zależy od przeglądarki |
| Blokowanie | 2–3 sekundy | Bez końca |
| Swap | 0ms | Bez końca |
| Kreacja zastępcza | 100ms | 3 sekundy |
| Opcjonalny | 100ms | Brak |
- Okres blokowania: okres blokowania rozpoczyna się, gdy przeglądarka zażąda czcionki internetowej. Jeśli w okresie blokowania czcionka internetowa nie jest dostępna, czcionka jest renderowana w niewidocznej czcionce zastępczej, a tekst jest niewidoczny dla użytkownika. Jeśli czcionka nie jest dostępna na końcu okresu blokowania, jest renderowana w czcionce zastępczej.
- Okres zamiany: okres zamiany następuje po okresie blokowania. Jeśli czcionka internetowa stanie się dostępna w okresie zamiany, zostanie „zamieniona”.
Strategie font-display odzwierciedlają różne punkty widzenia na temat kompromisu między wydajnością a estetyką. Trudno jest więc polecić konkretne rozwiązanie, ponieważ zależy ono od indywidualnych preferencji, tego, jak ważna jest czcionka internetowa dla strony i marki, oraz tego, jak bardzo irytująca może być czcionka, która pojawi się z opóźnieniem.
W przypadku większości witryn są to 3 najbardziej odpowiednie strategie, w zależności od priorytetu:
Wydajność: użyj
font-display: optional. Jest to najbardziej „wydajne” rozwiązanie: renderowanie tekstu jest opóźnione o nie więcej niż 100 ms i masz pewność, że nie wystąpią przesunięcia układu związane z zamianą czcionek. Wadą jest to, że czcionka internetowa nie będzie używana, jeśli pojawi się z opóźnieniem.Szybkie wyświetlanie tekstu i używanie czcionki internetowej: użyj
font-display: swapale upewnij się, że czcionka jest dostarczana wystarczająco wcześnie, aby nie powodowała przesunięcia układu. Wadą tej opcji jest irytujące przesunięcie, gdy czcionka pojawi się z opóźnieniem.Tekst jest wyświetlany w czcionce internetowej: użyj
font-display: block, ale upewnij się że czcionka jest dostarczana wystarczająco wcześnie, aby zminimalizować opóźnienie tekstu. Początkowe wyświetlanie tekstu jest opóźnione. Pomimo tego opóźnienia może to nadal powodować przesunięcie układu, ponieważ tekst jest rysowany jako niewidoczny, a miejsce czcionki zastępczej jest używane do rezerwowania miejsca. Po wczytaniu czcionki internetowej może ona wymagać innego miejsca, co powoduje przesunięcie. Może to być mniej irytujące przesunięcie niżfont-display: swap, ponieważ sam tekst nie będzie się przesuwać.
Pamiętaj też, że te 2 rozwiązania można łączyć. Na przykład użyj font-display: swap w przypadku elementów marki i innych elementów strony, które wyróżniają się wizualnie.
Użyj font-display: optional w przypadku czcionek używanych w tekście głównym.
Czcionki ikon
Strategie font-display, które dobrze sprawdzają się w przypadku konwencjonalnych czcionek internetowych, nie działają tak dobrze w przypadku czcionek ikon. Czcionka zastępcza dla czcionki ikon zwykle wygląda zupełnie inaczej niż czcionka ikon, a jej znaki mogą mieć zupełnie inne znaczenie. W rezultacie czcionki ikon częściej powodują znaczne przesunięcia układu.
Ponadto używanie czcionki zastępczej może być niepraktyczne. Jeśli to możliwe, zastąp czcionki ikon plikami SVG, co jest też lepsze pod względem dostępności. Nowsze wersje popularnych czcionek ikon zwykle obsługują SVG. Więcej informacji o przechodzeniu na SVG znajdziesz na stronie SVG Sprites w Font Awesome i w naszym przewodniku po ikonach Material.
Zmniejszenie przesunięcia między czcionką zastępczą a czcionką internetową
Aby zmniejszyć wpływ na CLS, możesz użyć
size-adjust atrybutów.
Podsumowanie
Czcionki internetowe nadal stanowią wąskie gardło wydajności, ale mamy coraz więcej opcji, które pozwalają nam je optymalizować, aby jak najbardziej zmniejszyć to wąskie gardło.