Разбираем различия между HTTP Preload и HTTP/2 Push

HTTP Preload и HTTP/2 Server Push используются для ускорения загрузки веб-приложения. В этой статье мы рассмотрим сходства и различия HTTP Preload и HTTP/2 Push. А также узнаем, когда нужно использовать каждую из них.

Что такое HTTP/2 Push?

HTTP/2 Push позволяет веб-разработчикам определять конкретные ресурсы, которые должны быть переданы клиенту вместе с HTML-документом. Традиционно клиентская сторона, запрашивающая ресурсы у сервера, сначала получает HTML-файл. Затем анализирует его, чтобы определить, какие ресурсы нужно запрашивать далее. После чего на сервер поступают дополнительные запросы.

Но благодаря HTTP/2 Push, сервер может заранее передавать ресурсы еще до того, как клиент проанализирует HTML. Например, есть сайт с файлом index.html и файлом style.css. В этом случае браузер сначала запрашивает index.html, а после его получения и анализа – файл style.css. Но поскольку мы знаем, что клиент все равно будет запрашивать style.css, можно указать серверу отправить style.css одновременно с index.html.

Что такое HTTP Preload?

HTTP Preload – это еще одна технология, которую можно использовать для предварительной отправки определенных ресурсов клиенту. Но директива Preload работает не так, как HTTP/2 Push.

С помощью директивы Preload можно указать браузеру запрашивать определенные высокоприоритетные ресурсы, необходимость которых он определяет только после анализа HTML-файла.

Предположим, что браузер запросил файл index.html. При его анализе браузер обнаруживает, что необходим style.css. А также что в этом CSS-файле есть ссылка на файл font.ttf. Предварительная загрузка позволяет отправлять на сервер запрос одновременно и на style.css, и на font.ttf. Поскольку font.ttf – это ресурс, который понадобится в ближайшем будущем.

Сходства и различия

HTTP Preload и HTTP/2 Push предоставляют браузеру необходимые ресурсы заранее. Тем не менее, существует несколько важных различий между этими технологиями. Например:

  • Синтаксис Preload и Push различается. Вы можете использовать директиву Preload, чтобы инициировать Push. Если вы хотите явно предварительно загрузить ресурс, а не вызывать Push, примените команду nopush следующим образом:
Link: rel=preload; </app/script.js>;  as=script; nopush
  • С помощью Push можно принудительно отправить ресурсы, как только сервер получит первоначальный запрос от браузера. Preload позволяет выполнить предварительную загрузку только после того, как браузер получит и проанализирует HTML-файл.
  • Preload позволяет загружать ресурсы со сторонних доменов. С помощью Push можно принудительно отправлять ресурсы только со своих доменов.
  • Preload еще не полностью поддерживается браузерами. А Push имеет больше поддержки, поскольку это функция HTTP/2.

Ниже приведена простая диаграмма от Nginx, которая лучше демонстрирует разницу между двумя технологиями.

Сходства и различия

Когда использовать Preload, а когда Push?

Нельзя применять Preload и Push для ускорения доставки всех используемых ресурсов одновременно. Вместо этого вы должны заранее отправлять только первоочередные ресурсы.

Несколько примеров использования Push:

  • Вместо встраивания кода CSS или JavaScript в HTML разместите его в отдельных файлах и принудительно отправьте браузеру.
  • Push отлично подходит для оптимизации использования серверных мощностей.

Примеры использования Preload:

  • Загрузка критически важного CSS, который поздно обнаруживается в HTML-документе.
  • Загрузка изображений из верхней части веб-страницы, на которые ссылается CSS-файл.
  • Загрузка шрифтов, на которые ссылается CSS-файл.

Использование Preload и HTTP/2 Push с KeyCDN

KeyCDN поддерживает HTTP/2 Push, если установить заголовок Link с директивой Preload. После этого KeyCDN будет отправлять ресурсы с помощью push:

add_header Link "</style.css>; as=style; rel=preload";

Но если вы не хотите использовать push, установите атрибут nopush. Кроме этого, если реализация HTTP/2 не принимает принудительно отправленные ресурсы, клиент будет рассматривать их как обычный предварительно загружаемый (preload) ресурс.

Итоги

HTTP Preload и HTTP/2 Push являются полезными механизмами. Но для эффективного их использования нужно провести проверку изменения скорости загрузки страниц. Не торопитесь и поэкспериментируйте с Preload и Push в своем собственном приложении.