Оптимизация изображений: next/image

Отдаём картинки правильного размера и формата автоматически — без ручной возни.

next/image — встроенный компонент Image, который автоматически ресайзит, сжимает, отдаёт современный формат (WebP/AVIF) и лениво грузит изображения, заметно ускоряя загрузку страницы.

Чем плох обычный <img>

С тегом <img> браузер качает картинку «как есть»: исходный размер и формат. На мобильном это лишние мегабайты, прыжки вёрстки при загрузке и медленный первый экран. next/image решает это автоматически.

Базовое использование

Импортируем Image и указываем размеры — они обязательны, чтобы зарезервировать место и избежать «прыжка» вёрстки:

import Image from "next/image";

export default function Avatar() {
  return (
    <Image
      src="/avatar.png"
      alt="Аватар пользователя"
      width={96}
      height={96}
    />
  );
}

Что делает компонент

ОптимизацияЭффект
Ресайз под устройствоМобайлу — маленькая версия, десктопу — большая
Современный форматWebP/AVIF вместо тяжёлого JPEG/PNG
Ленивая загрузкаКартинки вне экрана грузятся при прокрутке
Резерв местаНет «прыжка» вёрстки при появлении картинки

Внешние картинки

Если источник — чужой домен, его нужно явно разрешить в next.config.js, иначе Next.js откажется оптимизировать (это защита от произвольных URL):

{
  "images": {
    "remotePatterns": [
      { "protocol": "https", "hostname": "cdn.example.com" }
    ]
  }
}

Оценим экономию трафика

Прикинем, сколько весит картинка в исходном PNG и в оптимизированном WebP нужного размера:

const originalKb = 800;        // большой PNG
const resizedFactor = 0.25;    // ресайз под карточку
const webpFactor = 0.4;        // WebP компактнее

const optimized = Math.round(originalKb * resizedFactor * webpFactor);
console.log("Было, КБ:", originalKb);
console.log("Стало, КБ:", optimized);

Вывод:

Было, КБ: 800
Стало, КБ: 80

Итог

  • next/image сам ресайзит, сжимает и лениво грузит картинки.
  • width и height обязательны — резервируют место и убирают «прыжок» вёрстки.
  • Внешние домены картинок разрешают в next.config.js через remotePatterns.
Проверьте себя
1. Что автоматически делает компонент next/image?
AТолько меняет атрибут alt
BРесайзит, сжимает, отдаёт современный формат и лениво грузит картинку
CЗагружает картинку дважды для надёжности
DКонвертирует картинку в SVG
2. Зачем у Image обязательны width и height?
AДля SEO-описания
BЧтобы зарезервировать место и избежать прыжка вёрстки при загрузке
CЧтобы включить кэш
DЭто нужно только для внешних картинок
3. Что нужно сделать, чтобы оптимизировать картинку с чужого домена?
AНичего, работает сразу
BДобавить домен в images.remotePatterns в next.config.js
CСкачать картинку в public/
DОтключить оптимизацию
Поддержать проект