Уже сейчас браузеры могут самостоятельно ускорять загрузку веб-страниц в зависимости от поведения конкретного пользователя. Магия технологии заключается в том, что контент, который захочет увидеть пользователь, начинает загружаться еще до того, как он поймет, что хочет этого.
Мы способны сделать данный процесс более эффективным в несколько раз. Потому что разработчики прекрасно представляют обычный порядок действий юзера на их сайтах.
А зная ресурсы, которые запрашивают чаще других, нам было бы неплохо давать браузеру команду загружать их заранее. Это возможно с тегами links. Используя специальные атрибуты, теги links говорят обозревателю, что именно нужно скачивать, когда и почему.
Перед началом оптимизации вспомним, как происходит обычный HTTP-запрос.
Игорь хочет зайти на любой веб-ресурс.
Как видим, чтобы добраться до любого документа в интернете, нужно пройти большое количество этапов. И чтобы быстрее увидеть желаемый результат, этот процесс нужно начать как можно раньше.
Один из атрибутов способен определять отношение между текущим документом и тем, на который ведет ссылка. Речь идет о rel
(сокращенно от англ. «relationship»).
Организация W3C описывает много возможных значений данного атрибута. К примеру, вы точно знаете rel="stylesheet"
, используемый для включения файлов CSS.
Но сейчас нам интересны другие четыре атрибута: dns-prefetch, prerender, prefetch и preconnect. Обобщенно их называют
С помощью этого значения rel можно заблаговременно решить вопрос разрешения имен доменов, т. е. осуществить DNS-преобразование «доменное имя в требуемый IP-адрес».
Что касается пропускной способности каналов связи, DNS-запросы незначительны. Тем не менее, они часто выполняются с большой задержкой, что особенно характерно для мобильных сетей. Минимизировать эту неприятность можно благодаря предварительной выборке, скажем, когда юзер кликает по ссылке. Иногда задержку удается уменьшить даже на полную секунду.
Допустим, на справочной странице веб-сайта есть много ссылок на другой, дочерний портал. Вполне вероятно, что большинство пользователей на этот дочерний ресурс все-таки перейдут. Для улучшения клиентского опыта будет хорошей идеей использовать преждевременный поиск DNS, чтобы сократить время, в течение которого загрузится сайт.
<link rel="dns-prefetch" href="//othersite.org">
Видя данный код, браузер ставит в очередь задач поиск DNS второго сайта. И он приступит к нахождению необходимого IP-адреса сразу после того, как будут завершены все задачи с высоким приоритетом.
Таким образом, когда пользователь переходит по ссылке, браузер тут же устанавливает TCP-соединение, пропуская запрос к серверу DNS.
Это значение принуждает браузер заходить еще дальше, соединяясь с доменом, к которому может быть направлен запрос на подключение в будущем.
Прекрасный вариант для применения preconnect – это редиректы, так часто встречающиеся в сети. Если вы способны однозначно предсказать следующий запрос и планируете сделать перенаправление, то лучше сразу загрузить требуемый сайт: так задержка будет существенно уменьшена.
<link rel="preconnect" href="//othersite.com">
Когда указывается отношение prefetch, для загрузки ресурса браузер запрашивает доменное имя у DNS-сервера, осуществляет TCP-соединение, отправляет HTTP-запрос, а затем сохраняет сайт в кэше. Причем происходит это все в фоновом режиме, без видимых действий юзера.
Обращаться с данным значением нужно весьма осторожно. Потому что если ваше предсказание следующего шага пользователя окажется ошибочным, то сайт не то что не будет ускорен – его загрузка ощутимо замедлится. В некоторых ситуациях предугадать действия посетителя веб-страницы очень сложно. Так что перед использованием prefetch хорошо подумайте.
Идеально значение подходит для онлайн-книг, журналов, портфолио, фотогалерей, где реализована постраничная пагинация. Юзеры с большой долей вероятности будут загружать следующие страницы, поэтому можно предварительно подготовить некоторые их ресурсы. В этой строке кода, например, предусмотрена загрузка изображений:
<link rel="prefetch" href="//site.com/nextimage.jpg">
Атрибут rel="prerender"
используется для настройки только HTML-страниц. Подготовка документов в этом случае происходит оффлайн, а когда пользователь хочет открыть их, страницы сразу же показываются.
Для этого необходим большой объем памяти и много вычислений. Кроме того, рендеринг может потребовать от браузера дополнительных ресурсов (как вариант – изображений), из-за чего количество запросов возрастет. Поэтому злоупотреблять этой колоссальной возможностью не стоит.
<link rel="prerender" href="//site.com/about.html">
<link rel="preconnect" href="//xyzsite.com" pr="0.8">
<link rel="prerender" href="//example.com/about.html" pr="0.3">