Пошук уроків, статей та іншого контенту
Керуватимете пріоритетним завантаженням критичних зображень і відкладеним завантаженням інших.
Не всі зображення сторінки однаково важливі для користувача:
критичне зображення одразу видно у верхній частині сторінки, наприклад головне зображення статті або банер;
некритичні зображення розташовані нижче першого екрана й можуть завантажуватися пізніше.
Якщо браузер завантажує всі зображення одночасно, вони конкурують за мережу. Це може затримати показ головного зображення та погіршити метрику LCP.
Компонент Image у Next.js підтримує обидва сценарії:
пріоритетне завантаження — для критичних зображень;
відкладене завантаження — для зображень, які не потрібні одразу.
За замовчуванням зображення next/image завантажуються ліниво, якщо для них не вказано пріоритет.
import Image from "next/image";
export default function Gallery() {
return (
<section>
<h2>Фотогалерея</h2>
<Image
src="/images/photo-1.jpg"
alt="Гори на заході сонця"
width={1200}
height={800}
/>
</section>
);
}У цьому прикладі браузер не зобов’язаний завантажувати зображення одразу під час відкриття сторінки. Воно завантажиться, коли наблизиться до області видимості користувача.
За потреби режим можна вказати явно:
<Image
src="/images/photo-1.jpg"
alt="Гори на заході сонця"
width={1200}
height={800}
loading="lazy"
/>loading="lazy" варто використовувати для:
зображень у картках товарів;
фотографій у галереях;
аватарів нижче першого екрана;
зображень у довгих статтях;
декоративних або другорядних зображень.
Відкладене завантаження не означає, що зображення почне завантажуватися лише після прокручування до нього. Браузер зазвичай починає завантаження завчасно, коли зображення наближається до viewport.
Головне зображення сторінки часто потрібно завантажити якомога раніше. У сучасних версіях Next.js для цього використовується властивість preload.
import Image from "next/image";
export default function ArticleHeader() {
return (
<header>
<Image
src="/images/nextjs-guide-cover.jpg"
alt="Обкладинка посібника з Next.js"
width={1600}
height={900}
preload
/>
<h1>Оптимізація зображень у Next.js</h1>
</header>
);
}preload повідомляє браузеру, що зображення важливе й має бути завантажене з високим пріоритетом.
Використовуйте його лише для справді критичного зображення, зазвичай для:
головного зображення статті;
hero-зображення на landing page;
зображення, яке є найбільшим елементом першого екрана.
На одній сторінці зазвичай має бути одне пріоритетне зображення. Якщо зробити пріоритетними всі зображення, перевага зникає: вони почнуть конкурувати між собою за мережеві ресурси.
У старіших версіях Next.js для цього використовувалася властивість priority:
<Image
src="/images/nextjs-guide-cover.jpg"
alt="Обкладинка посібника з Next.js"
width={1600}
height={900}
priority
/>У нових версіях рекомендується використовувати preload. Якщо проєкт працює на старішій версії Next.js, використовуйте API, підтримуваний цією версією.
Не потрібно одночасно вказувати preload і loading="lazy" для одного зображення. Це суперечливі інструкції: перша вимагає раннього завантаження, друга — відкладеного.
Уявімо сторінку статті. Обкладинка статті видима одразу, а зображення в тексті розташовані нижче.
import Image from "next/image";
const paragraphs = [
"Next.js оптимізує зображення та допомагає контролювати їхнє завантаження.",
"Критичні ресурси потрібно завантажувати якомога раніше.",
"Некритичні зображення краще завантажувати лише тоді, коли вони наближаються до viewport.",
];
export default function ArticlePage() {
return (
<main>
<article>
<header>
<Image
src="/images/article-cover.jpg"
alt="Розробник працює над вебзастосунком"
width={1600}
height={900}
preload
/>
<h1>Як пришвидшити завантаження сторінки</h1>
</header>
{paragraphs.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
<Image
src="/images/article-diagram.jpg"
alt="Схема завантаження ресурсів сторінки"
width={1200}
height={700}
loading="lazy"
/>
<p>
Відкладене завантаження дає браузеру змогу спочатку зосередитися на
ресурсах, потрібних для першого екрана.
</p>
<Image
src="/images/article-example.jpg"
alt="Приклад оптимізованого інтерфейсу"
width={1200}
height={700}
loading="lazy"
/>
</article>
</main>
);
}У цьому прикладі:
article-cover.jpg має preload, оскільки це головне зображення сторінки.
Інші зображення мають loading="lazy, оскільки вони розташовані нижче.
Для кожного зображення вказані width і height, тому браузер може заздалегідь зарезервувати місце під нього.
Атрибути alt описують зміст зображень.
Якщо зображення розтягується на всю доступну ширину батьківського елемента, можна використати fill. У такому випадку батьківський елемент повинен мати позиціонування relative, а властивість sizes допомагає браузеру вибрати відповідний розмір файлу.
import Image from "next/image";
export default function Hero() {
return (
<section className="hero">
<Image
src="/images/hero.jpg"
alt="Місто в ранковому тумані"
fill
preload
sizes="100vw"
style={{ objectFit: "cover" }}
/>
</section>
);
}.hero {
position: relative;
min-height: 420px;
}Для зображення, яке не є критичним, preload потрібно замінити на loading="lazy":
<Image
src="/images/recommendation.jpg"
alt="Рекомендована стаття"
fill
loading="lazy"
sizes="(max-width: 768px) 100vw, 33vw"
style={{ objectFit: "cover" }}
/>sizes має відповідати реальній ширині зображення на різних екранах. Наприклад:
100vw — зображення займає всю ширину viewport;
33vw — приблизно третину ширини viewport;
(max-width: 768px) 100vw, 33vw — на малих екранах повна ширина, на більших — третина.
Перед додаванням preload перевірте, чи справді зображення:
видно без прокручування;
є важливою частиною вмісту;
може стати найбільшим видимим елементом першого екрана.
Для більшості інших зображень підходить стандартне або явне відкладене завантаження.
Орієнтуйтеся на таке правило:
Зображення потрібне для першого екрана → preload
Зображення розташоване нижче → loading="lazy"<Image src="/images/one.jpg" alt="..." width={800} height={500} preload />
<Image src="/images/two.jpg" alt="..." width={800} height={500} preload />
<Image src="/images/three.jpg" alt="..." width={800} height={500} preload />Так браузер отримує кілька високопріоритетних ресурсів одночасно. Це може сповільнити завантаження головного зображення.
Пріоритетним має бути лише критичний ресурс або невелика кількість справді необхідних ресурсів.
preload для зображення нижче першого екранаЯкщо зображення користувач побачить лише після кількох прокручувань, його раннє завантаження витрачає мережу без користі для першого екрана.
Не використовуйте одночасно:
<Image
src="/images/hero.jpg"
alt="Головне зображення"
width={1600}
height={900}
preload
loading="lazy"
/>Оберіть один режим:
<Image
src="/images/hero.jpg"
alt="Головне зображення"
width={1600}
height={900}
preload
/>або:
<Image
src="/images/secondary.jpg"
alt="Додаткове зображення"
width={1200}
height={700}
loading="lazy"
/>Якщо не вказати розміри зображення та неправильно використати fill, під час завантаження може змінюватися розмітка сторінки.
Для звичайного зображення вказуйте width і height. Для fill подбайте про розміри та позиціонування батьківського контейнера.
sizes разом із fillБез sizes браузер може не вибрати оптимальний варіант зображення для поточної ширини екрана. Для адаптивних зображень вказуйте реальний розподіл ширини через sizes.
next/image зазвичай відкладає завантаження некритичних зображень.
Для явного відкладеного завантаження використовуйте loading="lazy".
Для головного зображення першого екрана в сучасних версіях Next.js використовуйте preload.
У старіших версіях Next.js аналогом є priority.
Не робіть пріоритетними всі зображення сторінки.
Для зображень із fill задавайте sizes.
Для звичайних зображень вказуйте width і height, щоб уникати зміщення розмітки.