Прелоад изображений: не всё так очевидно 🖼
Восемь способов управлять загрузкой изображений: fetchpriority, preload, responsive-картинки и распространённые костыли.

Наткнулся на хороший разбор про способы сказать браузеру «эта картинка важная».
Коротко по вариантам:
1. Обычный <img />
Браузер сам решает приоритет. Часто — достаточно хорошо.
2. Атрибут loading="lazy"
Откладывает загрузку.
Хорошо для всего, что ниже изначального viewport.
Плохо, если случайно повесить на hero → замедлите LCP.
3. Атрибут fetchpriority="high" (самый практичный вариант)
Даёт явный сигнал приоритета:
<img src="/hero.jpg" fetchpriority="high" alt="" />
👉 В большинстве случаев — лучшее решение для LCP-картинок
Без лишней магии и дублей.
4. Тэг <link rel="preload" as="image"> в <head />
Жёстко форсит раннюю загрузку:
<link rel="preload" as="image" href="/hero.jpg" />
Но:
- легко сделать двойную загрузку
- можно забить сеть и сломать приоритеты
- требует аккуратности (типы,
imagesrcset,sizes)
👉 Использовать точечно
Для responsive-картинок следует использовать атрибуты rel="preload", imagesrcset и imagesizes.
<link
rel="preload"
as="image"
imagesrcset="hero-800.jpg 800w, hero-1600.jpg 1600w"
imagesizes="100vw"
/>
👉 Иначе браузер может скачать не тот размер
5. Скрытый <img /> или display: none
<div style="display:none">
<img src="/hero.jpg" alt="" />
</div>
👉 Браузер всё равно начнёт загрузку.
Но это скорее костыль — приоритет будет неочевидный, и читаемость страдает.
6. background-image в CSS
.hero {
background-image: url("/hero.jpg");
}
👉 Вот тут нюанс:
браузер узнаёт о такой картинке только после парсинга CSS,
поэтому она часто грузится позже, чем <img />.
7. Хаки с background + preload / скрытые элементы
Типа прелоадить background через <link /> или подсовывать невидимый <img />.
👉 Всё это работает, но выглядит как обход ограничений, а не нормальный путь.
8. JS через new Image()
const img = new Image();
img.src = "/hero.jpg";
👉 Старый способ, который хуже дружит с приоритетами браузера.
———
Главный вывод из статьи:
- способов «заставить» браузер грузить картинку раньше — много
- но большинство из них — костыли или edge-case решения
👉 Практика:
- для hero →
fetchpriority="high" - для background → иногда оправдан
preload - всё остальное — только если понимаешь последствия
TL;DR:
Не нужно изобретать схемы с hidden div и хаками — в 90% случаев есть более простой и нативный способ.