Атрибут fetchpriority в HTML: что это и как использовать

Атрибут fetchpriority (от английского fetch priority, «приоритет загрузки») подсказывает браузеру, какой файл скачивать раньше, а какой позже. Закрывающий тег для него не нужен: атрибут пишется внутри открывающего тега, например fetchpriority="high", а у самого <img> закрывающего тега нет.

У атрибута три значения: high, low и auto. Это подсказка, а не команда: браузер учитывает её по своим правилам. Я проверил, как записи читаются в разметке и в скрипте, и как меняется приоритет запроса картинки, и описал только то, что подтвердилось.

HTML
<img src="hero.jpg" alt="Главное фото"
  width="1200" height="600"
  fetchpriority="high">

Что такое атрибут fetchpriority в HTML и зачем он нужен

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

Он отвечает только за порядок запросов. Он не решает, нужно ли скачивать файл вообще: это делает loading. Не меняет он и этап обработки скачанной картинки, о нём рассказывает decoding.

  • high: файл важнее соседей, браузеру лучше запросить его раньше.
  • low: файл можно запросить позже соседей.
  • auto: выбор за браузером. Так работает всё без атрибута.

В справочнике MDN это называется «Fetch Priority API», а раньше то же самое называли «Priority Hints». Подробнее в описании на MDN.

Для каких тегов работает fetchpriority: img, link и script

По описанию на MDN атрибут относится к <img>, <link> и <script>. Я создал разные элементы и проверил, есть ли у них свойство fetchPriority. Оно оказалось только у этих трёх.

Теги, у которых работает fetchpriority
ТегЧто приоритизируетсяПример записи
<img>Файл картинки<img src="a.jpg" alt="" fetchpriority="high">
<link>Файл, который подключает ссылка: стили, предзагрузка<link rel="preload" as="image" href="a.jpg" fetchpriority="high">
<script>Файл скрипта<script src="app.js" fetchpriority="low"></script>

У <iframe>, <video>, <picture>, <source>, <input> и <canvas> свойства нет, в SVG у элемента image тоже. Если картинка лежит внутри <picture>, атрибут пишут у вложенного img, а не у source.

Пример: у каких элементов есть fetchPriority

Выберите элемент и посмотрите, есть ли у него свойство в вашем браузере.

Результат

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

Какие значения принимает fetchpriority: high, low и auto

Допустимы три значения. Любые другие браузер не отвергает, но считает их равными auto. Ниже результаты проверки свойства img.fetchPriority в браузере, на котором я проверял.

Что возвращает свойство fetchPriority при разных записях
ЗаписьСвойство img.fetchPriorityПример записи
highhighfetchpriority="high"
lowlowfetchpriority="low"
autoautofetchpriority="auto"
HIGHhigh: регистр не важенfetchpriority="HIGH"
highestauto: такого значения нетfetchpriority="highest"
high с пробелом в началеauto: пробел делает значение невернымfetchpriority=" high"
Пустое значениеautofetchpriority=""
Атрибута нетauto<img src="a.jpg" alt="">

Значение auto по умолчанию, поэтому писать его незачем.

Пример: какие значения fetchpriority принимает браузер

Выберите значение и посмотрите, что записано в атрибуте и что вернуло свойство.

Результат

Свойство возвращает ваш браузер, результат может отличаться от моих замеров.

Чем fetchpriority отличается от loading, decoding и preload

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

Какой вопрос решает каждая настройка
НастройкаНа какой вопрос отвечаетПример записи
loadingКогда начать скачивание: сразу или ближе к показуloading="lazy"
fetchpriorityВ каком порядке запрашивать файлыfetchpriority="high"
decodingКак превращать скачанный файл в пикселиdecoding="async"
rel="preload"Запросить файл заранее, до разбора остальной разметки<link rel="preload" as="image" href="a.jpg">

Предзагрузка и приоритет дополняют друг друга. Как описано на MDN, в примере с главной картинкой используют обе: preload запрашивает файл заранее, а fetchpriority="high" поднимает его в очереди.

Когда повысить приоритет, а когда понизить

Выбор зависит от роли картинки на странице. Это рекомендации по смыслу, а не результаты замеров по скорости.

Какое значение выбирать
СлучайЧто записатьПример записи
Главная картинка вверху страницыhigh<img src="hero.jpg" alt="" fetchpriority="high">
Картинки в карусели, кроме первойlow<img src="slide2.jpg" alt="" fetchpriority="low">
Картинки ниже первого экранаОбычно loading="lazy"<img src="a.jpg" alt="" loading="lazy">
Второстепенный скриптlow<script src="stats.js" fetchpriority="low"></script>
Всё остальноеНичего не писать<img src="a.jpg" alt="">

В моём замере в браузере, на котором я проверял, запрос картинки с fetchpriority="high" получил приоритет High, с low получил Low, а картинка без атрибута получила Medium. Но это начальный приоритет одного запроса. Как это отразится на скорости страницы, зависит от других файлов, и обещать ускорение нельзя. MDN предупреждает, что атрибут нужно использовать умеренно: если поднять приоритет у многих файлов, преимущество исчезает.

Отдельное замечание: high имеет смысл ставить на одну-две самые важные картинки, а не на все.

Fetchpriority вместе с loading="lazy"

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

Я проверил такой случай: картинка с loading="lazy" и fetchpriority="high", расположенная в первом экране. Она запросилась с приоритетом High, то есть отложенная загрузка её не задержала, потому что картинка и так была в зоне видимости. Для картинки ниже первого экрана решающим остаётся loading: ленивая картинка скачивается, когда приближается к видимой области.

HTML
<!-- первая картинка: сразу и с высоким приоритетом -->
<img src="hero.jpg" alt="" fetchpriority="high">

<!-- остальные: позже -->
<img src="a.jpg" alt="" loading="lazy">

Практическое правило: главную картинку не делают ленивой, и приоритет high пишут именно ей. Остальным хватит loading="lazy". Подробнее о ленивой загрузке в статье про loading.

Атрибут работает не только у картинок. У <link> он меняет приоритет файла, который подключается ссылкой, а у <script> приоритет скрипта.

Примеры fetchpriority у link и script
ЗадачаКак записатьПример записи
Предзагрузить главную картинку с высоким приоритетомАтрибут у link с rel="preload"<link rel="preload" as="image" href="hero.jpg" fetchpriority="high">
Понизить приоритет необязательного скриптаАтрибут у script<script src="stats.js" fetchpriority="low"></script>
Поднять приоритет важного скриптаАтрибут у script<script src="app.js" fetchpriority="high"></script>

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

Fetchpriority в JavaScript: свойство fetchPriority

В скрипте атрибут доступен как свойство fetchPriority с большой буквой P. Запись в свойство меняет атрибут, а чтение приводит значение к допустимому.

Как работает свойство fetchPriority
ДействиеЧто получилосьПример записи
Чтение без атрибутаВернулось autoimg.fetchPriority
Запись допустимого значенияАтрибут в разметке изменилсяimg.fetchPriority = 'low'
Запись неверного значенияАтрибут записан как есть, свойство возвращает autoimg.fetchPriority = 'junk'

Для картинки, созданной скриптом, свойство лучше записать до присвоения src, чтобы приоритет был известен к моменту запроса.

HTML
const img = new Image();
img.fetchPriority = 'high';
img.src = 'hero.jpg';

console.log(img.fetchPriority);   // "high"

Частые ошибки в атрибуте fetchpriority

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

ОшибкаЧто происходитКак исправить
fetchpriority="highest", fetchpriority="fast"Неизвестное значение читается как autoПисать только high, low или auto
fetchpriority=" high"Пробел делает значение невернымПисать без пробелов
fetchpriority="auto"Это и так значение по умолчаниюУбрать атрибут
high у каждой картинкиКогда всё важно, выделить главное нельзяОставить high одной-двум картинкам
Ждут от атрибута гарантииЭто подсказка, итог зависит от браузераПроверять результат во вкладке сети
fetchpriority вместо loadingПриоритет не откладывает загрузкуДля отложенной загрузки использовать loading="lazy"
loading="lazy" на главной картинкеФайл запрашивается позже, чем нужноУбрать lazy и поставить high
Атрибут у source или pictureУ этих тегов свойства нет, атрибут ничего не делаетПисать атрибут у вложенного img
Атрибут у iframe, video, canvasВ моей проверке у них свойства нетНе рассчитывать на атрибут, искать другие способы
Записывают fetchpriority после src в скриптеЗапрос мог уже уйти с обычным приоритетомПрисваивать свойство до src
Ждут, что low ускорит страницуПонижение освобождает очередь, но выигрыш не гарантированСравнить загрузку до и после во вкладке сети

Шпаргалка по атрибуту fetchpriority

Всё главное из статьи в одной таблице.

Атрибут fetchpriority: что и как писать
ЗадачаКак записатьПример записи
Запросить файл раньшеЗначение high<img src="hero.jpg" alt="" fetchpriority="high">
Запросить файл позжеЗначение low<img src="a.jpg" alt="" fetchpriority="low">
Оставить выбор браузеруБез атрибута<img src="a.jpg" alt="">
Допустимые значенияТри значения без пробеловhigh | low | auto
Тегиimg, link, script<script src="a.js" fetchpriority="low"></script>
Картинка в pictureАтрибут у вложенного img<picture><source srcset="a.webp"><img src="a.jpg" alt="" fetchpriority="high"></picture>
Прочитать значениеСвойство fetchPriorityimg.fetchPriority
Не путатьloading отвечает за момент скачиванияloading="lazy"
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×