Скорость загрузки сайта – важный пункт технической оптимизации сайта.

Ранее мы уже рассказывали о 12 способах, как увеличить этот показатель в этой статье. В случае если все рекомендации выполнены, а скорость сайта желает лучшего, можно воспользоваться специальными директивами и ресурсными подсказками для браузеров (Resource Hints), чтобы увеличить показатели скорости вашего сайта.

В этой статье будут рассмотрены следующие директивы и ресурсные подсказки для браузеров:

  • Preload
  • Prefetch
  • dns-prefetch
  • Preconnect
  • Prerender

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

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

В случае, если все ресурсы браузера заняты более важным процессом, он спокойно проигнорирует такие подсказки.

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

Эти подсказки помогут скорее посетителю сайта и практически не повлияют на оценочные баллы PageSpeed.

Данные директивы относительно недавно появились, поэтому на старых версиях браузеров они не поддерживаются. Если вы хотите их использовать, следует обновить свой браузер.

Версии браузеров, поддерживающие те или иные ресурсные подсказки, можно посмотреть по ссылкам:

Разберемся с директивами по очереди. Предлагаю начать с dns-prefetch.

Dns-prefetch

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

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

Обработка dns-prefetch происходит в фоновом режиме во время просмотра пользователем страницы сайта.

Например, так мы сообщим о том, что надо проверить связь с dns Яндекса.

Следующая директива preconnect.

Preconnect

Отвечает за предварительное соединение. С ее помощью браузером устанавливается соединение до того, как отправлен HTTP-запрос.

Отличается от dns-prefetch тем, что не только ищет указанный днс, но и выполняет обмен пакетами с сервером (клиент -> сервер -> клиент), и тем самым инициирует TCP-соединение с сервером.

TCP (Transmission Control Protocol, протокол управления передачей) – один из основных протоколов передачи данных интернета. Представляет собой поток данных с предварительной установкой соединения. Осуществляет повторный запрос данных в случае их потери, а также устраняет дублирование при получении двух копий одного пакета, гарантируя тем самым целостность передаваемых данных.

В случае, если сайт использует HTTPS-соединение, выполняет два раунда обмена пакетами (клиент -> сервер -> клиент -> сервер -> клиент) для инициализации безопасного TLS-соединения.

TLS (англ. transport layer security – протокол защиты транспортного уровня) – протокол, обеспечивающий защищённую передачу данных между узлами в сети Интернет.

Данный протокол широко используется в приложениях, работающих с сетью Интернет, таких как веб-браузеры, работа с электронной почтой, обмен мгновенными сообщениями и IP-телефонии.

Рассмотрим пример использования preconnect для Яндекс.Метрики:

Практическое сравнение preconnect и dns-prefetch

Скорость сайта без использования подсказок, TLS-соединение:

Скорость сайта без использования подсказок, TLS-соединение

Скорость сайта без использования подсказок, TCP-соединение:

Скорость сайта без использования подсказок, TCP-соединение

Добавим к TLS-соединению подсказки и получим вот такую картину.

TLS-соединение с использованием preconnect:

TLS-соединение с использованием preconnect

TLS-соединение с использованием dns-prefetch:

TLS-соединение с использованием dns-prefetch

Теперь можно наглядно увидеть различие между dns-prefetch и preconnect: для второго вместе с обращением к dns сразу выполняется обмен пакетами для установки TCP- или TLS-соединения. И в дальнейшем, когда происходит непосредственно обработка скрипта в коде, из цепочки загрузки исключаются эти этапы, что сокращает скорость загрузки.

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

Стоит учесть, что это усредненное значение из выборки тестов, были единичные случаи, когда загрузка происходит быстрее, а также наоборот.

Prefetch

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

Prefetch имеет низкий приоритет среди остальных подсказок, его стоит использовать для ресурсов, которые понадобятся в будущем.

Однако в режиме простоя браузер не будет находиться вечно. Из этого вытекает вопрос, что будет с ресурсами, для которых указана директива prefetch, после того как пользователь перейдет на другую страницу и прервет режим простоя?

Ответ прост: браузер сохранит в кэше загруженную часть и вернется к дальнейшей загрузке снова, используя заголовок Content-Range, когда страница будет полностью загружена.

Пример:

С помощью атрибута as указывается тип ресурса. Это помогает браузеру выбрать приоритет загрузки для предварительной выборки.

Также позволяет браузеру понять, совместим ли запрос с политикой безопасности контента в соответствии с атрибутом as. С помощью этого атрибута браузер может посылать подходящие заголовки accept, основываясь на типе ресурса.

Атрибут as может иметь следующие значения:

  • audio: аудио файлы
  • document: HTML документ, встраиваемый с помощью или