Оптимизация веб-шрифтов

В предыдущих модулях вы узнали, как оптимизировать HTML, CSS, JavaScript и медиаресурсы. В этом модуле откройте для себя некоторые методы оптимизации веб-шрифтов.

Веб-шрифты могут влиять на производительность страницы как во время загрузки, так и во время рендеринга. Загрузка больших файлов шрифтов может занять некоторое время и негативно повлиять на First Contentful Paint (FCP) , в то время как неправильное значение font-display может вызвать нежелательные сдвиги макета, которые способствуют кумулятивному сдвигу макета страницы (CLS) .

Прежде чем обсуждать оптимизацию веб-шрифтов, полезно знать, как они обнаруживаются браузером, чтобы вы могли понять, как CSS предотвращает извлечение ненужных веб-шрифтов в определенных ситуациях.

Открытие

Веб-шрифты страницы определяются в таблице стилей с помощью объявления @font-face :

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

Предыдущий фрагмент кода определяет font-family с именем "Open Sans" и сообщает браузеру, где найти соответствующий ресурс веб-шрифта. Для экономии пропускной способности браузер не загружает веб-шрифт, пока не определит, что макет текущей страницы нуждается в нем.

h1 {
  font-family: "Open Sans";
}

В предыдущем фрагменте CSS браузер загружает файл шрифта "Open Sans" при анализе элемента <h1> в HTML-коде страницы.

preload

Если ваши объявления @font-face определены во внешней таблице стилей, браузер может начать загрузку только после загрузки таблицы стилей. Это делает веб-шрифты поздно обнаруженными ресурсами, но есть способы помочь браузеру обнаружить веб-шрифты раньше.

Вы можете инициировать ранний запрос ресурсов веб-шрифтов, используя директиву preload . Директива preload делает веб-шрифты обнаруживаемыми на ранней стадии загрузки страницы, и браузер немедленно начинает их загрузку, не дожидаясь завершения загрузки и анализа таблицы стилей. Директива preload не ждет, пока шрифт понадобится на странице.

<!-- The `crossorigin` attribute is required for fonts—even
     self-hosted ones, as fonts are considered CORS resources. -->
<link rel="preload" as="font" href="/https/web.dev/fonts/OpenSans-Regular-webfont.woff2" crossorigin>

Встроенные объявления @font-face

Вы можете сделать шрифты обнаруживаемыми раньше во время загрузки страницы, встроив CSS, блокирующий рендеринг, включая объявления @font-face , в <head> вашего HTML с помощью элемента <style> . В этом случае браузер обнаруживает веб-шрифты раньше во время загрузки страницы, так как ему не нужно ждать загрузки внешней таблицы стилей.

Встраивание деклараций @font-face имеет преимущество перед использованием подсказки preload , поскольку браузер загружает только шрифты, необходимые для отображения текущей страницы. Это исключает риск загрузки неиспользуемых шрифтов.

Скачать

После обнаружения веб-шрифтов и проверки того, что они необходимы для текущего макета страницы, браузер может загрузить их. Количество веб-шрифтов, их кодировка и размер файла могут существенно влиять на скорость загрузки и отображения веб-шрифта браузером.

Размещайте свои веб-шрифты самостоятельно

Веб-шрифты могут обслуживаться через сторонние сервисы, такие как Google Fonts , или могут быть размещены самостоятельно на вашем источнике. При использовании стороннего сервиса вашей веб-странице необходимо открыть соединение с доменом провайдера, прежде чем она сможет начать загрузку необходимых веб-шрифтов. Это может задержать обнаружение и последующую загрузку веб-шрифтов.

Эти накладные расходы можно сократить, используя подсказку ресурса preconnect . Используя preconnect , вы можете указать браузеру открыть соединение с кросс-источником раньше, чем браузер это обычно делает:

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

Предыдущий фрагмент HTML намекает браузеру на необходимость установить соединение с fonts.googleapis.com и соединение CORS с fonts.gstatic.com . Некоторые поставщики шрифтов, такие как Google Fonts, обслуживают ресурсы CSS и шрифтов из разных источников.

Вы можете устранить необходимость в стороннем подключении, разместив свои веб-шрифты самостоятельно. В большинстве случаев размещение веб-шрифтов самостоятельно быстрее, чем загрузка их из кросс-источника. Если вы планируете размещать веб-шрифты самостоятельно, проверьте, использует ли ваш сайт сеть доставки контента (CDN) , HTTP/2 или HTTP/3, и устанавливает ли он правильные заголовки кэширования для веб-шрифтов, которые вам нужны для вашего сайта.

Используйте WOFF2 и только WOFF2

WOFF2 имеет широкую поддержку браузеров и лучшее сжатие — до 30% лучше, чем WOFF. Уменьшенный размер файла приводит к более быстрой загрузке. Формат WOFF2 часто является единственным, который необходим для полной совместимости с современными браузерами.

Подмножество ваших веб-шрифтов

Веб-шрифты обычно включают широкий спектр различных глифов , которые необходимы для представления широкого спектра символов, используемых в разных языках. Если ваша страница обслуживает контент только на одном языке — или использует один алфавит — вы можете уменьшить размер веб-шрифтов с помощью подмножества. Это часто делается путем указания числа — или диапазона — кодовых точек unicode .

Подмножество — это сокращенный набор глифов, которые были включены в исходный файл веб-шрифта. Например, вместо обслуживания всех глифов ваша страница может обслуживать определенное подмножество для латинских символов. В зависимости от необходимого подмножества удаление глифов может значительно уменьшить размер файла шрифта.

Некоторые поставщики веб-шрифтов, такие как Google Fonts, предлагают подмножества автоматически с помощью параметра строки запроса. Например, URL-адрес https://fonts.googleapis.com/css?family=Roboto&subset=latin предоставляет таблицу стилей с веб-шрифтом Roboto, который использует только латинский алфавит.

Если вы решили самостоятельно размещать свои веб-шрифты, следующим шагом будет создание и размещение этих подмножеств самостоятельно с помощью таких инструментов, как glyphanger или subfont .

Однако, если у вас нет возможности самостоятельно размещать собственные веб-шрифты, вы можете подмножество веб-шрифтов, предоставляемых Google Fonts, указав дополнительный параметр строки text запроса, содержащий только необходимые для вашего веб-сайта кодовые точки Unicode. Например, если на вашем сайте есть отображаемый веб-шрифт, которому требуется лишь небольшое количество символов для фразы «Welcome», вы можете запросить это подмножество через Google Fonts по следующему URL-адресу: https://fonts.googleapis.com/css?family=Monoton&text=Welcome . Это может значительно сократить объем данных веб-шрифтов, необходимых для одного шрифта на вашем веб-сайте, если такое экстремальное подмножество может быть полезным на вашем веб-сайте.

Рендеринг шрифта

После того, как браузер обнаружил и загрузил веб-шрифт, он может быть отображен. По умолчанию браузер блокирует отображение любого текста, использующего веб-шрифт, пока он не будет загружен. Вы можете настроить поведение браузера при отображении текста и указать, какой текст должен отображаться — или не отображаться — до полной загрузки веб-шрифта, используя свойство CSS font-display .

block

Значение по умолчанию для font-displayblock . С block браузер блокирует рендеринг любого текста, использующего указанный веб-шрифт. Разные браузеры ведут себя немного по-разному. Chromium и Firefox блокируют рендеринг максимум на 3 секунды перед использованием резервного варианта. Safari блокирует бесконечно, пока веб-шрифт не загрузится.

swap

swap — наиболее широко используемое значение font-display . swap не блокирует рендеринг и немедленно отображает текст в качестве резервного варианта перед заменой указанного веб-шрифта. Это позволяет вам немедленно отображать ваш контент, не дожидаясь загрузки веб-шрифта.

Однако недостатком swap является то, что он вызывает сдвиг макета, если резервный веб-шрифт и веб-шрифт, указанный в вашем CSS, сильно различаются по высоте строки, кернингу и другим метрикам шрифта. Это может повлиять на CLS вашего веб-сайта, если вы не позаботитесь об использовании подсказки preload для загрузки ресурса веб-шрифта как можно скорее или если вы не учтете другие значения font-display .

fallback

Значение fallback для font-display является чем-то вроде компромисса между block и swap . В отличие от swap браузер блокирует отображение шрифта, но подменяет резервный текст только на очень короткий период времени. Однако в отличие от block период блокировки чрезвычайно короткий.

Использование fallback значения может хорошо работать в быстрых сетях, где, если веб-шрифт загружается быстро, веб-шрифт является гарнитурой, используемой сразу при первоначальном отображении страницы. Однако, если сети медленные, резервный текст отображается первым после истечения периода блокировки, а затем заменяется, когда появляется веб-шрифт.

optional

optional — это наиболее строгое значение font-display , и использует ресурс веб-шрифта, только если он загружается в течение 100 миллисекунд. Если загрузка веб-шрифта занимает больше времени, он не используется на странице, а браузер использует резервную гарнитуру для текущей навигации, в то время как веб-шрифт загружается в фоновом режиме и помещается в кэш браузера.

В результате при последующих переходах по страницам веб-шрифт может использоваться немедленно, поскольку он уже загружен. font-display: optional позволяет избежать сдвига макета, наблюдаемого при использовании swap , но некоторые пользователи не видят веб-шрифт, если он появляется слишком поздно при первом переходе по страницам.

Демонстрации шрифтов

Проверьте свои знания

Когда браузер загружает ресурс веб-шрифта (при условии, что он не загружен с помощью директивы preload )?

Как только ссылка на него будет обнаружена в таблице стилей.
Попробуйте еще раз.
Когда CSSOM страницы создан и определен веб-шрифт, необходимый для текущего макета.
Правильный!

Какой единственный (и наиболее эффективный) формат необходим для предоставления веб-шрифтов всем современным браузерам?

ВОФФ2
Правильный!
ВОФФ
Попробуйте еще раз.
ТТФ
Попробуйте еще раз.
ЭОТ
Попробуйте еще раз.

Далее: Разделение кода JavaScript

Имея за плечами понимание оптимизации шрифтов, вы можете перейти к следующему модулю, который охватывает тему, которая имеет высокий потенциал для улучшения начальной скорости загрузки страницы для ваших пользователей, а именно отсрочку загрузки JavaScript посредством разделения кода . Поступая так, вы можете поддерживать пропускную способность и нагрузку на процессор на минимально возможном уровне во время фазы запуска страницы, периода времени, в течение которого пользователи, скорее всего, будут взаимодействовать с ней.