<Image> (Legacy)
Примеры
Начиная с Next.js 13, компонент next/image был переписан для повышения производительности и удобства разработки. Для обеспечения обратной совместимости при обновлении старый компонент next/image был переименован в next/legacy/image.
Просмотреть новую next/image Справочную информацию по API
Сравнение
По сравнению с next/legacy/image, новый компонент next/image имеет следующие изменения:
- Удален обертывающий
<span>вокруг<img>в пользу встроенного вычисления соотношения сторон - Добавлена поддержка свойства
styleс каноническим значением- Удалено свойство
layoutв пользуstyleилиclassName - Удалено свойство
objectFitв пользуstyleилиclassName - Удалено свойство
objectPositionв пользуstyleилиclassName
- Удалено свойство
- Удалена реализация
IntersectionObserverв пользу встроенной ленивой загрузки- Удалено свойство
lazyBoundary, так как нет встроенного аналога - Удалено свойство
lazyRoot, так как нет встроенного аналога
- Удалено свойство
- Удален конфигуратор
loaderв пользу свойстваloader - Свойство
altизменено с необязательного на обязательное - Изменен обработчик
onLoadingCompleteдля получения ссылки на элемент<img>
Обязательные свойства
Компонент <Image /> требует следующих свойств.
src
Должно быть одним из следующих:
- Статически импортированный файл изображения
- Строка пути. Это может быть либо абсолютный внешний URL, либо внутренний путь, в зависимости от свойства loader или конфигурации загрузчика.
При использовании внешнего URL, необходимо добавить его в remotePatterns в next.config.js.
width
Свойство width может представлять либо отображаемую ширину, либо исходную ширину в пикселях, в зависимости от свойств layout и sizes.
При использовании layout="intrinsic" или layout="fixed", свойство width представляет отображаемую ширину в пикселях, поэтому оно повлияет на то, насколько большим будет отображаться изображение.
При использовании layout="responsive", layout="fill", свойство width представляет исходную ширину в пикселях, поэтому оно повлияет только на соотношение сторон.
Свойство width является обязательным, за исключением статически импортированных изображений или изображений с layout="fill".
height
Свойство height может представлять либо отображаемую высоту, либо исходную высоту в пикселях, в зависимости от свойств layout и sizes.
При использовании layout="intrinsic" или layout="fixed", свойство height представляет отображаемую высоту в пикселях, поэтому оно повлияет на то, насколько большим будет отображаться изображение.
При использовании layout="responsive", layout="fill", свойство height представляет исходную высоту в пикселях, поэтому оно повлияет только на соотношение сторон.
Свойство height является обязательным, за исключением статически импортированных изображений или изображений с layout="fill".
Необязательные свойства
Компонент <Image /> принимает ряд дополнительных свойств помимо обязательных. В этом разделе описаны наиболее часто используемые свойства компонента Image. Подробные сведения о менее часто используемых свойствах см. в разделе Дополнительные свойства.
layout
Поведение макета изображения при изменении размера области просмотра.
layout |
Поведение | srcSet |
sizes |
Имеет обертки и элементы масштабирования |
|---|---|---|---|---|
intrinsic (по умолчанию) |
Масштабировать вниз, чтобы поместиться в ширину контейнера, до размера изображения |
1x, 2x (на основе imageSizes) |
N/A | да |
fixed |
Размер точно равен width и height |
1x, 2x (на основе imageSizes) |
N/A | да |
responsive |
Масштабировать, чтобы поместиться в ширину контейнера |
640w, 750w, ... 2048w, 3840w (на основе imageSizes и deviceSizes) |
100vw |
да |
fill |
Увеличиваться по осям X и Y, чтобы заполнить контейнер |
640w, 750w, ... 2048w, 3840w (на основе imageSizes и deviceSizes) |
100vw |
да |
-
Демонстрация макета
intrinsic(по умолчанию)- Когда
intrinsic, изображение будет уменьшать размеры для меньших окон, но сохранит исходные размеры для больших окон.
- Когда
-
Демонстрация макета
fixed- Когда
fixed, размеры изображения не будут изменяться при изменении области просмотра (отсутствие адаптивности), подобно встроенному элементуimg.
- Когда
-
Демонстрация макета
responsive- Когда
responsive, изображение будет уменьшать размеры для меньших окон и увеличивать для больших окон. - Убедитесь, что родительский элемент использует
display: blockв своём стилистическом описании.
- Когда
-
Демонстрация макета
fill- Когда
fill, изображение будет растягиваться по ширине и высоте до размеров родительского элемента, при условии, что родительский элемент является относительным. - Это обычно используется в паре со свойством
objectFit. - Убедитесь, что родительский элемент имеет
position: relativeв своём стилистическом описании.
- Когда
- Демонстрация фонового изображения
loader
Пользовательская функция для разрешения URL. Установка загрузчика как свойства компонента Image переопределяет значение загрузчика по умолчанию, определённого в разделе images раздела next.config.js.
Загрузчик — это функция, возвращающая строку URL изображения, с учётом следующих параметров:
Вот пример использования пользовательского загрузчика:
import Image from 'next/legacy/image'
const myLoader = ({ src, width, quality }) => {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
const MyImage = (props) => {
return (
<Image
loader={myLoader}
src="me.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}
sizes
Строка, предоставляющая информацию о ширине изображения на разных точках разрыва. Значение sizes существенно повлияет на производительность изображений, использующих layout="responsive" или layout="fill". Оно будет проигнорировано для изображений, использующих layout="intrinsic" или layout="fixed".
Свойство sizes служит двум важным целям, связанным с производительностью изображения:
Во-первых, значение sizes используется браузером для определения размера загружаемого изображения из автоматически сгенерированного набора источников. При выборе браузер ещё не знает размер изображения на странице, поэтому он выбирает изображение того же или большего размера, что и область просмотра. Свойство sizes позволяет сказать браузеру, что изображение будет фактически меньше, чем весь экран. Если не указать значение sizes, используется значение по умолчанию 100vw (полная ширина экрана).
Во-вторых, значение sizes анализируется и используется для обрезки значений в автоматически созданном наборе источников. Если свойство sizes содержит размеры, такие как 50vw, которые представляют процент от ширины области просмотра, то набор источников обрезается так, чтобы не включать значения, которые могут никогда не потребоваться.
Например, если вы знаете, что ваше стилистическое оформление сделает изображение полноэкранным на мобильных устройствах, в двухколоночном макете на планшетах и в трёхколоночном на настольных компьютерах, вы должны использовать свойство sizes, например, следующее:
import Image from 'next/legacy/image'
const Example = () => (
<div className="grid-element">
<Image
src="/example.png"
layout="fill"
sizes="(max-width: 768px) 100vw,
(max-width: 1200px) 50vw,
33vw"
/>
</div>
)
Этот пример sizes может оказать значительное влияние на показатели производительности. Без свойства 33vw sizes браузер выбрал бы изображение с шириной в 3 раза больше необходимой. Поскольку размер файла пропорционален квадрату ширины, без sizes пользователь загружал бы изображение, которое в 9 раз больше необходимого.
Дополнительные сведения о srcset и sizes:
quality
Качество оптимизированного изображения, целое число от 1 до 100, где 100 — наилучшее качество. По умолчанию 75.
priority
При значении true изображение будет считаться приоритетным и будет предзагружено. Ленивая загрузка автоматически отключена для изображений, использующих priority.
Вы должны использовать свойство priority для любого изображения, распознанного как элемент Largest Contentful Paint (LCP). Может быть уместно иметь несколько изображений с приоритетом, так как разные изображения могут быть элементом LCP для различных размеров области просмотра.
Должно использоваться только в том случае, если изображение видно над линией сгиба. По умолчанию установлено false.
местозаполнитель
Местозаполнитель для использования во время загрузки изображения. Возможные значения — blur или empty. По умолчанию empty.
Когда blur, свойство blurDataURL будет использоваться в качестве местозаполнителя. Если src — это объект из статического импорта, и импортируемое изображение .jpg, .png, .webp или .avif, то blurDataURL будет автоматически заполнен.
Для динамических изображений вы должны предоставить свойство blurDataURL. Такие решения, как Plaiceholder, могут помочь в генерации base64.
Когда empty, во время загрузки изображения местозаполнителя не будет, только пустое пространство.
Попробуйте:
- Демонстрация местозаполнителя
blur - Демонстрация эффекта мерцания с свойством
blurDataURL - Демонстрация эффекта цвета с свойством
blurDataURL
Дополнительные свойства
В некоторых случаях вам может потребоваться более продвинутое использование. Компонент <Image /> по желанию принимает следующие дополнительные свойства.
стиль
Разрешает передачу стилей CSS подлежащему элементу изображения.
Обратите внимание, что все режимы layout применяют собственные стили к элементу изображения, и эти автоматические стили имеют приоритет над свойством style.
Также помните, что необходимые свойства width и height могут взаимодействовать со стилистикой. Если вы используете стили для изменения width изображения, вы также должны установить стиль height="auto", иначе изображение будет искажено.
objectFit
Определяет, как изображение будет соответствовать своему контейнеру-родителю при использовании layout="fill".
Это значение передается свойству CSS object-fit для изображения src.
objectPosition
Определяет, как изображение позиционируется внутри родительского элемента при использовании layout="fill".
Это значение передается свойству CSS object-position, примененному к изображению.
onLoadingComplete
Функция обратного вызова, которая вызывается один раз после полной загрузки изображения и удаления местозаполнителя placeholder.
Функция onLoadingComplete принимает один параметр — объект со следующими свойствами:
загрузка
Внимание: Это свойство предназначено только для продвинутого использования. Переключение изображения на загрузку с
eagerобычно ухудшает производительность.Мы рекомендуем использовать свойство
priorityвместо этого, которое правильно загружает изображение с нетерпением почти во всех случаях использования.
Поведение загрузки изображения. По умолчанию lazy.
При значении lazy, отложите загрузку изображения до тех пор, пока оно не достигнет рассчитанного расстояния от области просмотра.
При значении eager, загрузите изображение немедленно.
blurDataURL
Ссылка Data URL для использования в качестве изображения-местозаполнителя до тех пор, пока изображение src не загрузится успешно. Действует только в сочетании с placeholder="blur".
Должно быть закодировано в base64. Оно будет увеличено и размыто, поэтому рекомендуется очень маленькое изображение (10 пикселей или меньше). Включение более крупных изображений в качестве местозаполнителей может навредить производительности вашего приложения.
Попробуйте:
- Демонстрация свойства
blurDataURLпо умолчанию - Демонстрация эффекта мерцания с свойством
blurDataURL - Демонстрация эффекта цвета с свойством
blurDataURL
Вы также можете сгенерировать Data URL сплошного цвета, чтобы соответствовать изображению.
lazyBoundary
Строка (с аналогичным синтаксисом свойству margin), которая действует как граница, используемая для определения пересечения области просмотра с изображением и запуска ленивой загрузки loading. По умолчанию "200px".
Если изображение вложено в родительский элемент со скроллингом, отличным от корневого документа, вам также необходимо назначить свойство lazyRoot.
lazyRoot
Ссылка React, указывающая на родительский элемент со скроллингом. По умолчанию null (область просмотра документа).
Ссылка должна указывать на элемент DOM или React-компонент, который передает ссылку подлежащему элементу DOM.
Пример ссылки на элемент DOM
import Image from 'next/legacy/image'
import React from 'react'
const Example = () => {
const lazyRoot = React.useRef(null)
return (
<div ref={lazyRoot} style={{ overflowX: 'scroll', width: '500px' }}>
<Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
<Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
</div>
)
}
Пример ссылки на React-компонент
import Image from 'next/legacy/image'
import React from 'react'
const Container = React.forwardRef((props, ref) => {
return (
<div ref={ref} style={{ overflowX: 'scroll', width: '500px' }}>
{props.children}
</div>
)
})
const Example = () => {
const lazyRoot = React.useRef(null)
return (
<Container ref={lazyRoot}>
<Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
<Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
</Container>
)
}
unoptimized
При значении true исходное изображение будет передаваться как есть, вместо изменения качества, размера или формата. По умолчанию false.
import Image from 'next/image'
const UnoptimizedImage = (props) => {
return <Image {...props} unoptimized />
}
Начиная с Next.js 12.3.0, это свойство можно назначить всем изображениям, обновив next.config.js следующей конфигурацией:
module.exports = {
images: {
unoptimized: true,
},
}Другие свойства
Другие свойства компонента <Image /> будут переданы подлежащему элементу img за исключением следующих:
-
srcSet. Используйте Размеры устройств вместо этого. -
ref. ИспользуйтеonLoadingCompleteвместо этого. -
decoding. Оно всегда"async".
Параметры конфигурации
Удаленные шаблоны
Для защиты вашего приложения от злоумышленников требуется конфигурация для использования внешних изображений. Это гарантирует, что внешние изображения только из вашей учетной записи могут быть переданы из API оптимизации изображений Next.js. Эти внешние изображения могут быть сконфигурированы с помощью свойства remotePatterns в вашем файле next.config.js, как показано ниже:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
port: '',
pathname: '/account123/**',
},
],
},
}Важно знать: Приведенный выше пример гарантирует, что свойство
srcкомпонентаnext/legacy/imageдолжно начинаться сhttps://example.com/account123/. Любой другой протокол, хост, порт или несоответствующий путь приведет к ответу 400 Bad Request.
Ниже приведен другой пример свойства remotePatterns в файле next.config.js:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: '**.example.com',
port: '',
},
],
},
}Важно знать: Приведенный выше пример гарантирует, что свойство
srcкомпонентаnext/legacy/imageдолжно начинаться сhttps://img1.example.comилиhttps://me.avatar.example.com, или любым количеством поддоменов. Любой другой протокол, порт или несоответствующий хост приведет к ответу 400 Bad Request.
Дикие карты могут быть использованы как для pathname, так и для hostname, и имеют следующий синтаксис:
-
*соответствует одному сегменту пути или поддомену -
**соответствует любому количеству сегментов пути в конце или поддоменов в начале
Синтаксис ** не работает посреди шаблона.
Важно знать: Если опустить
protocol,portилиpathname, то подразумевается дикая карта**. Это не рекомендуется, поскольку это может позволить злоумышленникам оптимизировать URL, которые вы не планировали.
Домены
Предупреждение: Устарело с Next.js 14 в пользу строгого
remotePatternsдля защиты вашего приложения от злоумышленников. Используйтеdomainsтолько в том случае, если вы владеете всем содержимым, передаваемым с домена.
Аналогично remotePatterns, конфигурация domains может быть использована для предоставления списка разрешенных хостов для внешних изображений.
Однако, конфигурация domains не поддерживает сопоставление по шаблонам с дикими картами, и она не может ограничивать протокол, порт или путь.
Ниже приведен пример свойства domains в файле %%%CODE_BLOCK_203%%:
module.exports = {
images: {
domains: ['assets.acme.com'],
},
}Настройка загрузчика
Если вы хотите использовать облачный провайдер для оптимизации изображений вместо встроенного API оптимизации изображений Next.js, вы можете настроить префикс loader и path в вашем файле %%%CODE_BLOCK_207%%. Это позволит вам использовать относительные URL для изображения src и автоматически генерировать правильный абсолютный URL для вашего провайдера.
module.exports = {
images: {
loader: 'imgix',
path: 'https://example.com/myaccount/',
},
}Встроенные загрузчики
Включены следующие облачные провайдеры оптимизации изображений:
- По умолчанию: работает автоматически с
next dev,next start, или пользовательским сервером - Vercel: работает автоматически при развертывании на Vercel, настройка не требуется. Подробнее
-
Imgix:
loader: 'imgix' -
Cloudinary:
loader: 'cloudinary' -
Akamai:
loader: 'akamai' - Пользовательский:
loader: 'custom'используйте пользовательский облачный провайдер, реализовав свойствоloaderв компонентеnext/legacy/image
Если вам нужен другой провайдер, вы можете использовать свойство loader с next/legacy/image.
Изображения не могут быть оптимизированы на этапе сборки с помощью
output: 'export', только по требованию. Чтобы использоватьnext/legacy/imageсoutput: 'export', вам потребуется использовать другой загрузчик, отличный от стандартного. Подробнее в обсуждении.
По умолчанию компонент
next/legacy/imageиспользуетsquoosh, так как он быстро устанавливается и подходит для среды разработки. При использованииnext startв вашей рабочей среде, настоятельно рекомендуется установитьsharp, выполнивnpm i sharpв каталоге вашего проекта. Это не требуется для развертываний на Vercel, так какsharpустанавливается автоматически.
data-docs-heading="" id="advanced">Продвинутые настройки
Следующая настройка предназначена для расширенных случаев использования и обычно не требуется. Если вы решите настроить нижеприведенные свойства, вы переопределите все изменения по умолчанию Next.js в будущих обновлениях.
Размеры устройств
Если вам известны ожидаемые ширины устройств ваших пользователей, вы можете указать список точек разрыва ширины устройств, используя свойство deviceSizes в next.config.js. Эти ширины используются, когда компонент next/legacy/image использует layout="responsive" или layout="fill", чтобы обеспечить правильное отображение изображения для устройства пользователя.
Если настройка не предоставлена, используется значение по умолчанию ниже.
module.exports = {
images: {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
},
}Размеры изображений
Вы можете указать список ширин изображений, используя свойство images.imageSizes в вашем файле next.config.js. Эти ширины конкатенируются с массивом размеров устройств, чтобы сформировать полный массив размеров, используемых для генерации srcset изображений.
Причина наличия двух отдельных списков заключается в том, что imageSizes используется только для изображений, которые предоставляют свойство sizes, указывающее, что изображение меньше полной ширины экрана. Таким образом, размеры в imageSizes должны быть меньше наименьшего размера в deviceSizes.
Если настройка не предоставлена, используется значение по умолчанию ниже.
module.exports = {
images: {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
},
}Допустимые форматы
Стандартный API оптимизации изображений Image Optimization API автоматически определяет поддерживаемые браузером форматы изображений через заголовок запроса Accept.
Если заголовок Accept соответствует более чем одному из настроенных форматов, используется первый соответствие в массиве. Таким образом, порядок массива имеет значение. Если соответствия нет (или исходное изображение анимированное), API оптимизации изображений вернётся к формату исходного изображения.
Если настройка не предоставлена, используется значение по умолчанию ниже.
module.exports = {
images: {
formats: ['image/webp'],
},
}Вы можете включить поддержку AVIF с помощью следующей конфигурации.
module.exports = {
images: {
formats: ['image/avif', 'image/webp'],
},
}Важно знать: кодирование AVIF, как правило, занимает на 20% больше времени, но сжимает изображения на 20% меньше по сравнению с WebP. Это означает, что при первом запросе изображения, как правило, будет медленнее, а последующие запросы, которые кэшированы, будут быстрее.
Поведение кэширования
Ниже описан алгоритм кэширования для стандартного загрузчика. Для всех остальных загрузчиков, пожалуйста, обратитесь к документации вашего облачного провайдера.
Изображения оптимизируются динамически по запросу и сохраняются в каталоге <distDir>/cache/images. Оптимизированный файл изображения будет возвращаться для последующих запросов до тех пор, пока срок действия не истечет. Когда выполняется запрос, соответствующий кэшированному, но истекшему файлу, истекшее изображение возвращается немедленно. Затем изображение оптимизируется повторно на заднем плане (также называется перепроверкой) и сохраняется в кэше с новой датой истечения срока действия.
Статус кэша изображения можно определить, прочитав значение заголовка ответа x-nextjs-cache (x-vercel-cache при развертывании на Vercel). Возможные значения следующие:
-
MISS- путь не находится в кэше (встречается не более одного раза, при первом посещении) -
STALE- путь находится в кэше, но срок перепроверки истек, поэтому он будет обновлен на заднем плане -
HIT- путь находится в кэше и срок перепроверки не истек
Срок действия (или Max Age) определяется либо настройкой minimumCacheTTL, либо заголовком изображения upstream Cache-Control, в зависимости от того, какое значение больше. В частности, используется значение max-age заголовка Cache-Control. Если оба s-maxage и max-age найдены, то s-maxage имеет приоритет. max-age также передается всем клиентским приложениям, включая CDN и браузеры.
- Вы можете настроить
minimumCacheTTL, чтобы увеличить время хранения кэша, когда изображение upstream не включает заголовокCache-Controlили его значение очень низкое. - Вы можете настроить
deviceSizesиimageSizes, чтобы уменьшить общее количество генерируемых изображений. - Вы можете настроить форматы, чтобы отключить несколько форматов в пользу единственного формата изображения.
Минимальное время хранения кэша
Вы можете настроить время жизни (TTL) в секундах для кэшированных оптимизированных изображений. Во многих случаях лучше использовать статический импорт изображения, который автоматически хеширует содержимое файла и кэширует изображение навсегда с заголовком Cache-Control значения immutable.
module.exports = {
images: {
minimumCacheTTL: 60,
},
}Срок действия оптимизированного изображения определяется либо значением minimumCacheTTL, либо значением заголовка изображения upstream Cache-Control, в зависимости от того, какое значение больше.
Если вам необходимо изменить поведение кэширования для каждого изображения, вы можете настроить headers, чтобы установить заголовок Cache-Control для изображения upstream (например, /some-asset.jpg, а не /_next/image сам по себе).
В настоящее время нет механизма для удаления кэша, поэтому лучше всего поддерживать значение minimumCacheTTL низким. В противном случае вам может потребоваться вручную изменить свойство src или удалить <distDir>/cache/images.
Отключить статические импорты
По умолчанию разрешается импортировать статические файлы, такие как import icon from './icon.png', и передавать их свойству src.
В некоторых случаях вам может потребоваться отключить эту функцию, если она конфликтует с другими плагинами, которые ожидают, что импорт будет работать иначе.
Вы можете отключить статические импорты изображений в вашем файле next.config.js:
module.exports = {
images: {
disableStaticImages: true,
},
}Опасно разрешить SVG
Стандартный загрузчик не оптимизирует SVG-изображения по нескольким причинам. Во-первых, SVG — это векторный формат, что означает, что его можно изменять без потерь. Во-вторых, SVG имеет много функций, аналогичных HTML/CSS, что может привести к уязвимостям без надлежащих заголовков Content Security Policy (CSP).
Поэтому рекомендуется использовать свойство unoptimized, когда свойство src известно как SVG. Это происходит автоматически, когда src заканчивается на ".svg".
Однако, если вам необходимо отображать SVG-изображения с помощью стандартного API оптимизации изображений, вы можете установить dangerouslyAllowSVG в своем файле next.config.js:
module.exports = {
images: {
dangerouslyAllowSVG: true,
contentDispositionType: 'attachment',
contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
},
}Кроме того, настоятельно рекомендуется также установить contentDispositionType для принудительного скачивания изображения браузером, а также contentSecurityPolicy для предотвращения выполнения сценариев, встроенных в изображение.
Анимированные изображения
Стандартный загрузчик автоматически обойдёт оптимизацию изображений для анимированных изображений и отобразит изображение как есть.
Автообнаружение анимированных файлов — это попытка, которая поддерживает форматы GIF, APNG и WebP. Если вы хотите явно отключить оптимизацию изображений для заданного анимированного изображения, используйте свойство unoptimized.
История версий
| Версия | Изменения |
|---|---|
v13.0.0 |
next/image переименовано в next/legacy/image
|
© 2024 Vercel, Inc.
Licensed under the MIT License.
https://nextjs.org/docs/pages/api-reference/components/image-legacy