Оптимизация изображения Next.js и imgix без знания его размера
Мне нужно отображать изображения на моем статически созданном веб-сайте Next.js, и я хотел бы сделать это в соответствии с современными передовыми методами.
Я видел, что Next.js включает в себя большую часть оптимизации из коробки. Учитывая, что у меня не будет изображений, сохраненных в разных размерах, я искал imgix, чтобы сделать это за меня.
Как я представлял себе эту настройку, я сбрасываю все изображения в ведро S3 (я знаю только имя файла), которое будет использоваться imgix. Учитывая имя файла и требования к ширине, я бы оставил его на
next/Image
для изменения размера и рендеринга изображений через загрузчик imgix.
Что меня смущает, так это то, что в документах Next.js упоминается , что ширина и высота должны быть известны заранее. Как я узнаю высоту, если я предоставлю imgix только ширину и позволю ему изменить размер?
Я уверен, что мне здесь не хватает чего-то очевидного, но указатель был бы очень признателен.
3 ответа
Небольшой отказ от ответственности, я работаю в imgix.
Надеюсь, я смогу уточнить, указав обязанности некоторых вещей, которые вы упомянули:
Next.js отвечает за манипулирование текстом/html/dom/больше (т.е. размещение тегов img с соответствующими атрибутами в разметке/html/и т. д.)
imgix отвечает за всю обработку изображений (т.е. почти так, как вы описали,
s3 => request a specific size => done
)разработчики/дизайнеры отвечают за макет страницы (например, css, общую структуру html)
Связанный раздел в документации Next.js хорошо объясняет изменение макета и способы его избежать (это может быть проблемой для вас или не быть).
Высота (и ширина) ваших изображений определяется макетом вашей страницы. Например, вы разработали галерею изображений, в которой отображаются изображения одинакового размера (т. е. каждое изображение ограничено сверху верхней частью строки, нижней — нижней частью строки и слева/справа — столбцами).
Как я узнаю высоту, если я предоставлю imgix только ширину и позволю ему изменить размер?
Один из способов узнать, каковы размеры ваших изображений / должны быть, чтобы ваш дизайнер сказал вам, какими они должны быть. Многим из нас не так повезло, поэтому, если вы дизайнер , как только вы будете удовлетворены своим макетом, вы можете проверить ширину/высоту визуализированных изображений, а затем использовать эту информацию для предоставления атрибутов ширины/высоты для Next.js. составная часть.
Они также указывают третий вариант, который включает использование "
layout="fill"
что заставляет изображение расширяться, чтобы заполнить его родительский элемент». Если вы выберете этот третий вариант, помните: «При использовании
layout='fill'
, родительский элемент должен иметь
position: relative
."
Опять же, все это в контексте предотвращения смещения макета. Если вы укажете ширину изображений для imgix, высота будет рассчитана в соответствии с соотношением сторон исходного изображения. Вы также можете указать соотношение сторон вместе с другими параметрами, чтобы получить желаемый эффект.
Я закончил загрузку в imgix во время сборки, что также вернуло бы мне размеры изображения. Основываясь на них, я рассчитал соотношение, и на основе этого и желаемой ширины я также мог вычислить высоту.
Насколько я читал в документации здесь и знаю из своих проектов, Next.js уже делает это, используя Sharp внутри , поэтому всегда обслуживает изображение правильного размера для каждого устройства при использовании
next/image
составная часть. Без необходимости иметь изображение разных размеров.
Соответствующий раздел из документации
Некоторые оптимизации, встроенные в компонент Image, включают:
Улучшенная производительность: всегда используйте изображение правильного размера для каждого устройства, используя современные форматы изображений.
Визуальная стабильность: автоматическое предотвращение кумулятивного смещения макета.
Более быстрая загрузка страниц: изображения загружаются только тогда, когда они попадают в область просмотра, с дополнительными заполнителями для размытия.
Гибкость активов: изменение размера изображения по запросу, даже для изображений, хранящихся на удаленных серверах.