Введение в компонент изображения в Next.js

Next.js - мой любимый интерфейсный фреймворк, потому что он имеет множество преимуществ по сравнению с базовым приложением React. Одним из таких преимуществ является встроенный компонент Image и автоматическая оптимизация изображений, которые они добавили в версии 10.

В этой статье мы рассмотрим компонент Image из Next.js и узнаем, как использовать его для оптимизации изображения с внешнего веб-сайта. В этом примере мы будем работать в create-next-app начальном проекте.

Если вы не знаете, что такое Next.js, ознакомьтесь со статьей ниже, чтобы начать работу. Затем вернитесь к этой статье, чтобы узнать о компоненте Image.



К концу этой статьи вы должны понять следующее:

  • Что такое компонент изображения?
  • Каковы преимущества использования компонента изображения?
  • Как оптимизировать изображения, размещенные на внешних сайтах?
  • Как использовать компонент Image в проекте?
  • Как растянуть изображение, чтобы оно соответствовало родительскому элементу?

Компонент изображения

Компонент изображения из Next.js является расширением элемента HTML <img>. Мы можем использовать компонент Image, импортировав его из next/image.

import Image from 'next/image';

Преимущества

  • Позволяет изменять размер, оптимизировать и обслуживать изображения в современных форматах, что позволяет избежать отправки больших изображений на устройства с меньшим окном просмотра.
  • Позволяет Next.js автоматически принимать будущие форматы изображений и предоставлять их браузерам, поддерживающим эти форматы.
  • Оптимизирует изображения по запросу, а не во время сборки, поэтому время сборки не увеличивается.
  • По умолчанию изображения загружаются лениво, что означает, что на скорость страницы не влияют изображения за пределами области просмотра.
  • Изображения отображаются таким образом, чтобы избежать кумулятивных сдвигов макета, что помогает улучшить рейтинг поиска в Google.

Настроить домены

Мы можем воспользоваться преимуществами оптимизации изображений в Next.js для изображений, которые также размещены на других веб-сайтах.

Для этого нам нужно добавить конфигурацию в next.config.js файл. Нам нужно указать, из каких доменов разрешено оптимизировать изображения.

В этом примере я хочу разрешить изображения с https://unsplash.com/. Итак, я добавлю images.unsplash.com в качестве обслуживаемого внешнего домена.

module.exports = {
  images: {
    domains: ['images.unsplash.com'],
  },
}

Требуемый реквизит

Теперь мы можем визуализировать наше изображение. Компонент Image принимает 4 необходимых свойства.

  • src - чтобы получить источник любого изображения из Unsplash, просто щелкните изображение правой кнопкой мыши и выберите «Копировать адрес изображения».

  • alt - значимый текст, описывающий изображение.
  • width - ширина изображения в пикселях.
  • height - высота изображения в пикселях.
<Image
  src="https://images.unsplash.com/photo-1519861531473-9200262188bf?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=2102&q=80"
  alt="basketball"
  height={426}
  width={640}
/>

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

Вы можете узнать размеры изображения в Unsplash, щелкнув стрелку в правом верхнем углу.

Если мы добавим ширину и высоту с другим соотношением сторон, изображение изменится соответствующим образом. Например, если мы изменим ширину и высоту этого изображения на квадрат размером 400 пикселей каждый, это приведет к следующему изображению.

<Image
  src="https://images.unsplash.com/photo-1519861531473-9200262188bf?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=2102&q=80"
  alt="basketball"
  height={400}
  width={400}
/>

Как видите, изображение сжато, чтобы соответствовать указанной нами ширине и высоте.

Ручки различных размеров

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

В этой ситуации вы можете не указывать ширину и высоту в компоненте Image. Вместо этого добавьте опору layout="fill". Это растянет изображение до ширины и высоты родительского элемента. При использовании опоры layout="fill" часто лучше сочетать ее с objectFit="cover". Это позволит изображению сохранить свое соотношение сторон при заполнении всего поля содержимого элемента.

Для этого оберните компонент Image как дочерний по отношению к элементу <div>. Затем добавьте ширину и высоту к родительскому элементу <div>, а также присвойте ему position="relative".

<div className={styles.image}>
  <Image
    src="https://images.unsplash.com/photo-1519861531473-9200262188bf?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=2102&q=80"
    alt="basketball"
    layout="fill"
    objectFit="cover"
  />
</div>
// styles
.image {
  height: 400px;
  width: 400px;
  position: relative;
}

Здесь мы видим, что изображение занимает желаемый квадрат размером 400 пикселей, но соотношение сторон изображения остается неизменным. Части изображения, которые не помещаются в родительский элемент, обрезаются.

Для более сложных случаев есть другие реквизиты, которые вы также можете добавить в компонент Image. Ознакомьтесь с полной документацией здесь.

Заключение

Спасибо за прочтение! Надеюсь, эта статья помогла вам начать работу с компонентом Image из Next.js. Подробнее об оптимизации изображений можно прочитать здесь.

Я настоятельно рекомендую использовать компонент Image вместо обычного тега <img>, если вы работаете над проектом Next.js. Реализовать его легко, и он дает так много преимуществ.

Если вы хотите узнать, как обрабатывать маршрутизацию в Next.js, ознакомьтесь со статьей ниже.