Оптимизируем шрифты и ускоряем сайт на 5-12%

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

Загрузка страницы состоит из 3 ключевых этапов:

  1. Загрузка HTML кода.

  2. Загрузка CSS, JavaScript, шрифтов.

  3. Загрузка всего того, что можно загрузить отложено: изображения не видные на первом экране, виджеты соцсетей и рекламных блоков, видеоролики, онлайн консультанты и т. д.

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

Сейчас начался 3 этап загрузки страницы, на котором загрузятся фото товаров. Но страница уже интерактивна. Товары можно фильтровать, сортировать и добавлять в корзину.
Сейчас начался 3 этап загрузки страницы, на котором загрузятся фото товаров. Но страница уже интерактивна. Товары можно фильтровать, сортировать и добавлять в корзину.

Именно по завершении второго этапа пользователь приступает к изучению содержимого. Чем раньше этот этап завершится, тем лучше.

Шрифты в сжатом виде в формате woff2 могут занимать от 10% до 25% размера всех файлов страницы, загружаемых на первых двух этапах. Мы учитываем именно создаваемую нагрузку на сеть. Например, HTML, CSS, JavaScript код перед передачей по сети сжимается в 4-5 раза с помощью технологии gzip. То есть, 10%-25% это именно доля от объёма передаваемых данных.

Таким образом, сократив размеры шрифтов в 2 раза, можно добиться ускорения на 5%-12%, что очень весомо. Тем более что работа по оптимизации займёт не более часа. Как это сделать, мы расскажем в этой статье.

Способы ускорения

Оставляем только используемые символы

Первое, что стоит сделать — это удалить все неиспользуемые символы из файлов шрифтов. Файл шрифтов может содержать тысячи символов, но на странице используется полторы сотни.

Каждая языковая версия содержит только необходимый набор символов.
Каждая языковая версия содержит только необходимый набор символов.

Например, для этой страницы достаточно всего 160 символов, в них входят:

  1. Буквы кириллицы в верхнем и нижнем регистре — 66 букв.

  2. 10 цифр.

  3. Буквы латинского алфавита в верхнем и нижнем регистре — 42 буквы. Они часто используются для указания названий товаров и брендов.

  4. 42 знака препинания, включая редко используемые. Вот они «»„““”‘’₽!@#%^&*()[]{}:;"|,.~…/<>'?=+-–—_.

Всё остальное нужно удалить. Удобней всего это сделать в сервисе «Оптимизация шрифтов».

Пример оптимизации популярных шрифтов. Сравнивается скачанный с fonts.google.com файл в ttf формате с оптимизированными в сервисе woff2:

Исходный

Русский

Английский

Немецкий

Французский

Roboto-Regular

168.3 КБ

15.4

15.4

16.1

17.5

OpenSans-Regular

129.8 КБ

14

14.2

14.8

15.6

Ubuntu-Regular

299.7 КБ

27.2

25.7

26.8

28.9

Lato-Regular

75.2 КБ

7.1

14.5

15.3

17.2

Сравнивается использования CDN сервиса google fonts с файлами, оптимизированными в сервисе на обычной странице с русским и английским текстом. Формат Woff2.

Размер файлов

Количество файлов

CDN сервис
-Roboto cyrillic regular
-Roboto latin regular

15.74 КБ
9.63 КБ
Всего 25.37 КБ

2

Комбинированный файл с кириллицей и латиницей вместе

21.6 КБ

1

Используйте самые современные форматы файлов

Тут всё просто: используйте woff2 формат, а не ttf, otf или woff. Чтобы браузер использовал именно его, в списке файлов шрифтов он должен идти на первом месте.

Вот в таком порядке нужно указывать разные форматы файлов шрифтов.
Вот в таком порядке нужно указывать разные форматы файлов шрифтов.

Сокращение глиф шрифтов

Если вы используйте шрифтовой файл с глиф иконками вроде Font Awesome, Typicons, Iconic и других, то рекомендуем заменить их на SVG версии и вставить в ваш CSS код. Перевести SVG код в CSS вам поможет этот сервис.

Это самый современный и эффективный способ хранения глиф иконок по следующим причинам:

  1. Разместив SVG иконки в файле CSS, вы экономите 1 запрос на подгрузку отдельного файла шрифтов.

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

  3. Код SVG иконок сжимаются вместе с CSS кодом, что обеспечивает большую степень сжатия. Ведь чем крупнее файл, тем лучше работает gzip технология.

Если использование формата SVG иконок у вас вызывает сложности, то постарайтесь просто удалить все неиспользуемые иконки из ваших глиф файлов шрифтов. Сформировать такой файл вы можете в сервисах fontello.com и icomoon.io.

Просто выбираете нужные иконки и получаете свою версию только с ними.
Просто выбираете нужные иконки и получаете свою версию только с ними.

Количество шрифтов

В идеале нужно использовать только 2 шрифта: обычный и жирный. Это полезно не только с точки зрения быстроты загрузки страницы, но и с точки зрения дизайна.

Используя минимальное количество шрифтов, вы получите:

  1. Однообразный текст, который проще воспринимать. Пользователи будут медленней уставать, читая текст.

  2. Переборщив с разнообразием, дизайн потеряет единообразие и консистентность. Человек может запутаться и ему сложней будет интуитивно понять структуру и каркас страницы.

Кэширование шрифтов в браузере

Обязательно укажите длительное время кеширования для файлов шрифтов. Это делается в настройках веб-сервера.

В nginx в настройках виртуального хоста укажите

location ~ \.(|woff2|woff|ttf|otf)$ {
    expires 1y;
    add_header Cache-Control "public ";
    etag on;
}

В apache включите модули expires и deflate командой a2enmod expires;a2enmod deflate;service apache2 restart. Затем добавьте в конфигурационный файл виртуального хоста или .htaccess следующие строки:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE application/x-font
    AddOutputFilterByType DEFLATE application/x-font-truetype
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE application/x-font-opentype
    AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
    AddOutputFilterByType DEFLATE font/ttf
    AddOutputFilterByType DEFLATE font/otf
    AddOutputFilterByType DEFLATE font/woff
    AddOutputFilterByType DEFLATE font/woff2
    AddOutputFilterByType DEFLATE font/opentype
</IfModule>

AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType font/woff .woff
AddType font/woff2 .woff2

<IfModule mod_expires.c>
    ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
    ExpiresByType font/ttf "access plus 1 year"
    ExpiresByType font/otf "access plus 1 year"
    ExpiresByType font/woff "access plus 1 year"
    ExpiresByType font/woff2 "access plus 1 year"
    ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>

Ваш веб сервер начнёт отправлять заголовок «Expires», который даёт команду браузеру хранить и не запрашивать повторно файлы 1 год. Это самый эффективный метод кеширования.

Предзагрузка файлов

Ссылки на файлы шрифтов содержится в CSS файлах. Получается, чтобы загрузить шрифт, нужно выполнить цепочку из 3 звеньев: загрузить HTML код страницы → загрузить CSS файл → загрузить файл шрифта.

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

Вы можете дать команду браузеру загрузить шрифты сразу, тем самым сократив цепочку до 2 звеньев: загрузка HTML кода страницы → загрузка файла шрифта.

Для этого прям в коде HTML страницы в секции <head> укажите тег preload:

<link rel="preload" href="/dir/font-name.woff2" as="font" type="font/woff2" />

Так файл шрифтов загрузится быстрее и текст на странице покажется раньше на 50-120 миллисекунд.

Совместимость со старыми браузерами

Вам будет достаточно загрузить шрифты в 3 форматах: woff2, woff, truetype. Это обеспечивает поддержку в следующих браузерах: IE 9+, Edge 1+, Chrome 3.5+, Safari 3.1+, Firefox 3.5+, Opera 10.1+, Android 2.2+, Safari for iOS 4.2+. Это 98.39% пользователей всего интернета согласно сайту caniuse. Или все пользователи, чей браузер вышел после 2010 года.

Резервные и безопасные шрифты

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

Для этого в теге <body> HTML кода страницы указать шрифты в аттрибуте style вот так:

<body style="font-family: Tahoma, Verdana, sans-serif">.

Шрифты Tahoma и Verdana, как правило, установлены в операционной системе пользователя будь то Linux, Windows или MacOS. Поэтому они служат в качестве резервных. Если же их по какой-то причине нет, то будет использоваться шрифт семейства sans-serif заданный по умолчанию. Он называется страховочный.

Подборка комбинаций резервных + страховочных шрифтов доступна здесь. Выберите тот, что наиболее близок к вашему основному шрифту.

Ошибки при ускорении шрифтов

Дескриптор font-display и подёргивания текста при загрузке

Шрифт задаётся командой font-family. Причём задаются минимум 4 шрифта. Например, код font-family: Roboto, Tahoma, Verdana, sans-serif означает следующее:

  1. Использовать шрифт Roboto, как основной, если он доступен. Файлы этого шрифта загружаются браузером отдельными запросами.

  2. Если их нет, то использовать резервные шрифты Tahoma или Verdana. Эти шрифты установлены по умолчанию в операционной системе. Поэтому могут служить временной заменой основному шрифту. То есть, - это резервные шрифты. Хорошая подборка резервных шрифтов доступна здесь.

  3. В случае если и резервные шрифты недоступны, использовать шрифт семейства sans-serif используемый в браузере по умолчанию. Он называется страховочный.

С помощью команды font-display вы можете указать стратегию загрузки шрифтов. Она может принимать следующие значения:

  1. Auto — поведение по умолчанию. Чаще всего используется режим «block» о котором ниже.

  2. Block - Ждём 3 секунды, пока не загрузится основной шрифт. Всё это время текст скрыт со страницы. Если основной шрифт не успел загрузиться, то используем резервный или страховочный. Как только основной шрифт всё же загрузится, переключаемся на него. То есть, в этом варианте текст может быть скрыт от пользователя на время до 3 секунд.

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

  4. Fallback - Ждём 0.1 секунды пока не загрузится основной шрифт. Всё это время текст скрыт со страницы. После этого используем резервный или страховочный. Если основной шрифт успел загрузиться за 3 секунды, то используем его. Если основной шрифт не успел загрузиться за 3 секунды, то продолжаем использовать резервный или страховочный.

  5. Optional - ждём 0.1 секунды пока не загрузится основной шрифт. Если он не загрузился, то используем резервный или страховочный. Даже если основной шрифт загрузится, то продолжаем использовать резервный или страховочный.

Мы же рекомендуем использовать режим auto, он же block по следующим причинам:

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

  2. Режимы Swap и fallback позволяют пользователю увидеть текст как можно раньше. Но велика вероятность, что шрифты погрузятся после 0.1 секунды, и пользователь увидит резкое изменение типографики страницы. Это воспринимается как глюк или подёргивание и воспринимается негативно. Лучше избавить пользователя от необходимости наблюдать за резкими перестраиваниями страницы во время загрузки.

Использование CDN сервисов

Лучше использовать файлы шрифтов, оптимизированные конкретно под ваш сайт. Используйте сервис оптимизации шрифтов и рекомендации из этой статьи, чтобы добиться максимальной скорости и удобства.

Популярные сервисы Google Fonts или Adobe Fonts плохи по следующим причинам:

  1. Размеры файлов. Файлы шрифтов CND сервисов плохо оптимизированы и содержат большое количество лишних символов например ±, ½, символы десятка валют, буквы с указанием ударения á и т. д.

  2. Лишние служебные операции. Для загрузки гугл шрифтов нужно подключиться к доменам fonts.gstatic.com и fonts.googleapis.com. Для этого нужно выполнить служебные операции: сделать запрос к CDN сервисам и отправить запрос на установку соединения. Это не окупается. При загрузке файлов шрифтов с CND сервиса, они загружаются параллельно файлам с основного домена. То есть, ограничение в 6-8 потоков на один домен их не сдерживает. Но файл шрифта весит 20 килобайт, и их нужно 2-3 штуки. Даже с учётом ограничения в 6-8 потоков на загрузку файлов с одного домена, они загрузятся быстрее, чем браузер успеет отправить запросы к CDN сервисам и установить соединения с серверами fonts.gstatic.com и fonts.googleapis.com.

  3. Кросс-сайтовое кеширование — миф. Утверждается, что если пользователь загружал файлы шрифтов на другом сайте, то на вашем будут использоваться уже закешированные копии. Но Google Chrome, и Safari запрещают использование разными сайтами закешированных файлов со сторонних ресурсов в целях борьбы с отслеживанием.

Вывод

Для максимального ускорения загрузки шрифтов нужно выполнить всего несколько простых рекомендаций. Это займёт 2-3 часа. Но этими рекомендациями часто пренебрегают. Также рекомендую проверить ваш сайт сервисом Быстрый Апгрейд Сайта, который проверит соблюдение вышеописанных рекомендаций.

Используемая литература:

  • https://developer.chrome.com/blog/font-display/

  • https://iainbean.com/posts/2021/5-steps-to-faster-web-fonts/

Источник: https://habr.com/ru/articles/779504/


Интересные статьи

Интересные статьи

Привет! Это Виталий Чесноков, сооснователь TEAMLY — платформы для совместной работы и управления знаниями. В своей практике я замечаю, что у компаний есть трудности с тем, чтобы внедрить базу знаний в...
В 3CX V18 Update 5 мы представили новый модуль чата для сайта и обновили соответствующий бесплатный плагин для WordPress. Все настройки модуля теперь перенесены в интерфейс управления 3CX (ранее были ...
Для того чтобы получить полезный трафик не обязательно платить за размещение рекламных постов и баннеров на сторонних площадках и тратить на это значительную часть своего рекламного бюджета. Уже давно...
Приветствую всех профессионалов и любителей сайтостроения! Предлагаю вашему вниманию перевод статьи "Client-Side Rendering vs Server-Side Rendering vs Static-Site Generation" от...
Что должен содержать макет сайта, который передают на вёрстку? Ховеры и другие состояния интерактивного элемента вносят в макет или прописывают в отдельной документации? Как сделать работу дизайнера и...