Скорость сайта, свойства шрифта font-display: варианты и опции использования

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

Определение поведения веб-шрифта при его загрузке может быть важным методом настройки производительности. Новый дескриптор отображения шрифтов для @font-faceпозволяет разработчикам решать, как их веб-шрифты будут отображаться (или откладываться) в зависимости от того, сколько времени потребуется для их загрузки.

Различия в рендеринге шрифтов сегодня

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

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

Браузер Тайм-аут Fallback Swap
Chrome 35+ 3 секунды да да
Опера 3 секунды да да
Fire Fox 3 секунды да да
Internet Explorer 0 секунд да да
Сафари Без тайм-аута N / A N / A
  • У Chrome и Firefox есть трехсекундный тайм-аут, после которого текст отображается с резервным шрифтом. Если шрифту удается загрузить, то в конечном итоге происходит замена, и текст повторно отображается с предполагаемым шрифтом.
  • Internet Explorer имеет тайм-аут в 0 секунд, что приводит к немедленной отрисовке текста. Если запрошенный шрифт еще не доступен, используется резервный вариант, и текст повторно отображается позже, как только запрошенный шрифт становится доступным.
  • Safari не имеет тайм-аута (или, по крайней мере, ничего, кроме базового тайм-аута сети).

Что еще хуже, разработчики имеют ограниченный контроль над принятием решения о том, как эти правила повлияют на их приложение. Разработчик, ориентированный на производительность, может предпочесть иметь более быстрый начальный опыт с использованием резервного шрифта и использовать более удобный веб-шрифт только при последующих посещениях после того, как у него будет возможность загрузить. Используя такие инструменты, как Font Loading API, можно переопределить некоторые из поведения браузера по умолчанию и добиться повышения производительности, но это происходит за счет необходимости писать нетривиальные объемы JavaScript, которые затем должны быть встроены в страницу или запрашивается из внешнего файла, что вызывает дополнительную задержку HTTP.

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

График загрузки шрифтов

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

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

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

Какой шрифт-дисплей вам подходит?

Для работы с font-displayдескриптором добавьте его в свои @font-faceправила:

font-displayв настоящее время поддерживает следующий диапазон значений auto | block | swap | fallback | optional.

Значение auto

Auto использует любую стратегию отображения шрифтов, которую использует пользовательский агент. Большинство браузеров в настоящее время имеют стратегию по умолчанию, аналогичную блокировке .

Значение block

Block дает шрифту короткий период блока (в большинстве случаев рекомендуется 3 секунды) и бесконечный период подкачки. Другими словами, браузер сначала рисует «невидимый» текст, если шрифт не загружен, но меняет лицевую сторону шрифта, как только он загружается. Для этого браузер создает анонимный шрифт с метриками, аналогичными выбранному шрифту, но со всеми глифами, не содержащими «чернил». Это значение следует использовать только в том случае, если для использования страницы требуется отрисовка текста с использованием определенного шрифта.

Значение SWAP

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

Значение FALLback

Резервный режим дает шрифту чрезвычайно малый период блока (в большинстве случаев рекомендуется 100 мс или меньше) и короткий период подкачки (в большинстве случаев рекомендуется три секунды). Другими словами, начертание шрифта сначала отображается с запасным вариантом, если оно не загружено, но шрифт заменяется местами, как только он загружается. Однако, если пройдет слишком много времени, откат будет использоваться до конца жизни страницы. резервный вариант — хороший кандидат для таких вещей, как основной текст, где вы бы хотели, чтобы пользователь начал читать как можно скорее и не хотел мешать его работе, перемещая текст по мере загрузки нового шрифта.

Значение optional

Optional дает шрифту чрезвычайно малый период блока (в большинстве случаев рекомендуется 100 мс или меньше) и нулевой период подкачки. Подобно резервному варианту , это хороший выбор, когда загружаемый шрифт более удобен, но не критичен для работы. В необязательных листья значение его в браузер , чтобы решить , следует ли инициировать шрифт скачать, который он может выбрать не делать , или это может сделать это как низкий приоритет в зависимости от того, что он считает , что было бы лучше для пользователя. Это может быть полезно в ситуациях, когда у пользователя слабое соединение, и извлечение шрифта может быть не лучшим использованием ресурсов.

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

Тестирование воспринимаемой производительности

Итак, как мы можем проверить влияние этих различных font-displayнастроек на воспринимаемую производительность страницы веб-сайта? Один из способов — просто обновить @font-faceправило, развернуть его, а затем запустить через WebPageTest. Это работает, но есть другой способ упростить этот рабочий процесс.

И это за счет использования функциональности WebPageTest «Inject Script» (на вкладке «Advanced») и использования API загрузки шрифтов CSS .

Сценарий inject позволяет вам изменять свойства загрузки шрифтов на данной странице.

Здесь мы используем метод, очень похожий на то, что демонстрирует Энди Дэвис в своем блоге « Улучшение воспринимаемой производительности с помощью ссылки Rel = preconnect HTTP Header» .

Ниже вы можете найти упрощенный код, который можно использовать для этого, или в Gist, который можно найти здесь :

Измените приведенный выше код и вставьте его в текстовое поле «Inject Script». Приведенный выше код будет вставлен на тестовую страницу перед выполнением теста и загрузит и определит новый шрифт (с тем же font-familyименем) с вашими обновленными настройками.

Ключ к тому, чтобы заставить это решение работать, — убедиться, что добавленный вручную шрифт добавляется после@font-face регистрации шрифтов CSS . Поскольку приоритет одноименных шрифтов font-familyравен: побеждает последний добавленный. Это отражает CSS, например, если у вас есть два селектора с одинаковой специфичностью, тот, который идет последним, «перезаписывает» первый.

Давайте посмотрим на гипотетический график тестирования:

  1. Запускается WebPageTest, браузер согласовывает соединение с сервером и запрашивает HTML.
  2. HTML загружается и анализируется, запрашиваются другие ресурсы страницы, такие как CSS и JS.
  3. На этом этапе WPT внедряет JavaScript и выполняет его. Наш новый шрифт определяется и загружается с помощью API загрузки шрифтов.
  4. CSS загружается и анализируется, он также содержит @font-faceправило с той же базовой информацией (имя шрифта, URL-адрес шрифта и т. Д.).
  5. FontFaceОбъект и @font-faceявляется CSS-связным. При синтаксическом анализе CSS шрифт добавляется в конец списка (он последний), поэтому он имеет приоритет над шрифтом, добавленным вручную.
  6. Страница загружается в обычном режиме, никаких изменений от внедренного скрипта не наблюдается.

Пункт 3 — это непредсказуемая часть этого процесса. Нет никаких временных гарантий, что внедренный скрипт будет запущен после загрузки / анализа CSS. Он может отличаться в зависимости от браузера и запускается, как только документ существует. Итак, если приведенный выше код не работает для вас при настройке вашего конкретного сайта, что еще вы можете попробовать?

Решения

Итак, я нашел два решения для устранения этой проблемы:

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

Используя пользовательский интерфейс wpt, вы можете заблокировать загрузку активов. Здесь мы блокируем загрузку шрифта css.

В этой ситуации происходит то, что наш сценарий внедрения создает все соответствующие FontFaceобъекты, и они не теряют приоритет в соответствии с @font-faceправилами CSS. У этого метода есть несколько серьезных проблем:

  1. Что будет, если у вас много шрифтов? Вам необходимо воспроизвести их все в сценарии внедрения.
  2. А как насчет того, чтобы CSS вашего шрифта был объединен с другим CSS? По сути, вам нужно заблокировать все ваши страницы CSS.

Так что да, этот метод может работать, но он далек от совершенства.

Определить загрузку CSS

Отказ от ответственности : следующий метод работает, но загрузка веб-страницы является сложной и недетерминированной . Итак, то, что работает для одного запуска (как показано в тестах ниже), внезапно перестанет работать в других тестах, использующих тот же самый код. Метод блокировки CSS намного более предсказуем.

Я нашел лучший метод — это зацепиться за тот факт, что вы можете определить, когда файл CSS загружен, с помощью небольшого количества JavaScript. Для этого можно изменить сценарий инъекции. Вот Gist с измененным кодом:

С помощью этого скрипта мы подключаемся к событию загрузки CSS, содержащему наши @font-faceправила (это важно). Итак, вот что происходит в браузере:

  1. Запускается WebPageTest, браузер согласовывает соединение с сервером и запрашивает HTML.
  2. HTML загружается и анализируется, запрашиваются другие ресурсы страницы, такие как CSS и JS.
  3. На этом этапе WPT внедряет JavaScript, и он может выполняться. Если это так, мы создаем копию <link>элемента, загружающего наш @font-faceCSS, и ждем, пока он загрузится.
  4. CSS загружается и анализируется. Браузер создает FontFaceобъекты для @font-faceправил в CSS (связанных с CSS).
  5. Срабатывает событие загрузки CSS, и наши пользовательские FontFaceобъекты добавляются к FontFaceSetпоследним, поэтому они имеют приоритет над настройками шрифтов, связанных с CSS (например, font-displayсвойством).
  6. Страница загружается с нашими измененными настройками шрифта.

Вот и все. Быстрый способ проверить различные font-displayнастройки на реальном веб-сайте и посмотреть результаты в WebPageTest.

Отладка запуска WebPageTest

Это действительно полезный совет от Энди Дэвиса, который я немного изменил для этих примеров. Если вы хотите увидеть, как выглядит консольный вывод для браузера в тесте. Вставьте следующий код в текстовое поле ‘Inject Script’:

Затем в поле «Специальные показатели» в разделе «Пользовательские» введите следующие данные:

Вкладка настраиваемых показателей позволяет получать настраиваемые показатели из теста.

Это даст вам результат, похожий на этот:

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

Очень полезно, если вы ищете конкретную информацию о браузере во время тестового запуска.

Посмотрим на это в действии

Я создал очень простой набор страниц, чтобы продемонстрировать эту технику. Также есть небольшая информация о том, что печатается consoleв браузерах, поддерживающих API. Если вы знакомы с DevTools, просто откройте их, и вы увидите информацию в консоли. Я создал 4 тестовых страницы:

  1. Стандартная страница с одним веб-шрифтом, загруженным с помощью @font-faceправила CSS . Это наша ссылка control ( font-display: auto) .
  2. Стандартная страница + тот же веб-шрифт, добавленный второй раз с помощью API загрузки шрифтов, с font-display: swapустановленной ссылкой .
  3. Стандартная страница + тот же веб-шрифт, добавленный второй раз с помощью API загрузки шрифтов, с font-display: fallbackустановленной ссылкой .
  4. Стандартная страница + тот же веб-шрифт, добавленный второй раз с помощью API загрузки шрифтов, с font-display: optionalустановленной ссылкой .

Страницы 2, 3 и 4 являются доказательством правильности концепции. Каждый из них включает приведенный выше сценарий после fonts.cssфайла. Таким образом, на этих страницах шрифт будет добавлен вручную FontFaceSetвместе с новым font-displayсвойством. Будет ли отображаться какие-либо изменения в WebPageTest? ПРИМЕЧАНИЕ . Веб-шрифт применяется только к заголовку (h1) на страницах, поэтому вам следует сосредоточиться на этом в следующих тестах.

Диафильм с 4 страниц, показывающий разницу, которую сценарий может иметь при загрузке шрифта.

Вы можете поближе взглянуть на сравнение 4 страниц здесь , но вот результаты, как я их вижу:

  • Необязательно: заголовок отображается в начале с невидимым текстом-заполнителем. Через ~ 100 мс отображается резервный текст. Веб-шрифт никогда не отображается.
  • Резерв: заголовок отображается в начале с невидимым текстом-заполнителем. Через ~ 100 мс отображается резервный текст. Шрифт загружается в течение 3 секунд, поэтому его заменяют.
  • Swap: заголовок сразу загружается с видимым резервным шрифтом (например, период блока 0 с в действии). После загрузки резервный шрифт заменяется веб-шрифтом.
  • Авто: Как и ожидалось, установлено значение block. Отображается невидимый текст-заполнитель, текст не отображается, пока не будет загружен веб-шрифт.

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

В этих тестах мы используем страницу управления во всех случаях, а затем заставляем WebPageTest вводить скрипт с каждым из различных font-displayзначений. Полное сравнение результатов этих тестов можно увидеть здесь .

Результаты использования webpagetest для внедрения скриптов и изменения настроек шрифта.

Он выглядит удивительно похожим на изображение выше, не так ли? Фактически, при ближайшем рассмотрении мы видим точно такие же результаты, как указано выше, для наших вручную введенных страниц сценария. Таким образом, мы можем использовать WebPageTest для изменения font-displayсвойства страниц (и действительно любого свойства, которое не только для чтения ). Я уверен, что другие могут придумать и другие варианты использования этой техники.

3 КОММЕНТАРИИ

  1. статьи можно дополнить информацией о том, как улучшить производительность загрузки шрифтов на сайте:

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

    2. Ленивая загрузка шрифтов: можно применить технику ленивой загрузки шрифтов, при которой шрифты будут загружаться только в том случае, если они действительно используются на странице. Для этого можно использовать JavaScript и CSS.

    3. Кеширование шрифтов: использование кэширования позволит браузеру сохранить загруженные шрифты и использовать их при последующих запросах к сайту. Это позволит уменьшить время загрузки шрифтов при повторных посещениях страницы.

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

    5. Минимизация количества используемых шрифтов: использование большого количества различных шрифтов на сайте может замедлить его загрузку. Лучше выбрать несколько основных шрифтов и использовать их на всех страницах сайта.

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

  2. статьи упоминается, что новый дескриптор отображения шрифтов @font-face позволяет разработчикам решать, как их веб-шрифты будут отображаться (или откладываться) в зависимости от времени загрузки. Какие конкретные настройки и методы использования этого дескриптора рекомендует Google?

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь

62 − = 52

OK2WEB
OK2WEB
Более 12 лет занимаюсь разработкой и продвижением сайтов. Городские порталы, информационные и новостные сайты. Сейчас в основном разрабатываю интернет магазины и коммерческие сайты. Если у вас есть вопросы пишите, стараюсь оперативно ответить и помочь.

Решение ошибки: WordPress database error Duplicate entry ‘0’ for key ‘wp_posts.PRIMARY’ for query INSERT INTO `wp_posts`

Делал сайт и столкнулся с такой ошибкой. Почитал, поискал, никто не дает решения. Ошибка проявляет себя так, что при добавлении записи на сайте Wordpress у вас нет интерфейса для добавления статьи и по сути исчезает возможность добавлять статьи. Решение оказалось простым. Зашел в базу данных...

Справочник по Fastpanel вопросы и ответы (обновляется)

Fastpanel - это веб-панель управления для хостинга и управления виртуальными серверами. Эта панель предоставляет администраторам серверов и владельцам веб-сайтов набор инструментов для упрощения управления серверами, приложениями и веб-сайтами. Вот основные возможности и предназначение Fastpanel: Управление серверами: Fastpanel позволяет администраторам легко создавать, настраивать и удалять...

Вывод товаров случайным образом — полезные сниппеты Woocommerce

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

Вывод похожих товаров по атрибуту — полезные сниппеты Woocommerce

По умолчанию Woocommerce товары выводятся в виде похожих из товаров в категории. Это неудобно, так как не позволяют вывести в каталоге товаров правильно похожие. Решаем задачу просто с помощью сниппета. Вставляем в function.php или в место для кода вот такой сниппет: В данном варианте выведен...

Seo практики использования возможностей ИИ для работы с сайтом

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

Плагин Wordfence: как настроить сканирование сайта для проверки файлов и страниц

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