Webp и Avif для веб-изображений

Введение

Я считаю, что все сайты и приложения должны стремиться к скорости работы, которую можно охарактеризовать как “мгновенно”. Один из аспектов скорости работы сайта - это скорость загрузки изображений. Мы как разработчики должны убедиться, что наши изображения загружаются как можно быстрее. Единственный способ достичь этого – использовать картинки минимального размера в байтах. Этого можно достичь двумя путями:

  1. Зверски сжимать изображения, часто с потерей качества
  2. Использовать форматы изображений, которые сжимаются лучше, чем форматы, которые используются по умолчанию В этой статье мы рассмотрим второй путь.

Почему Webp и Avif?

WebP и AVIF – это новые форматы изображений, которые позволяют сжимать изображения в вебе в 2-3 раза больше, чем JPEG и PNG. Это означает, что веб-страницы загружаются и рендерятся быстрее. На данный момент оба этих формата поддерживаются большинством современных браузеров. Исключение составляет Safari с поддержкой WebP, но без поддержки AVIF (поддержка ожидается в macOS 13).

Как коневертировать изображения в Webp и Avif?

Для конвертации изображений в Webp и Avif можно использовать imagemagick.

convert input.jpg output.webp
convert input.jpg output.avif

В качестве примера, я взял данное изображение: ссылка. Вы можете скачать его и использовать для тестирования.

Давайте сравним размеры изображений в байтах в разных форматах.

wc -c input.jpg output.webp output.avif
 80061 input.jpg
 36994 output.webp
 13979 output.avif
131034 total

Обратите внимание:

Как видите, AVIF сжимает изображения лучше, чем WebP. Почему же, тогда мы не используем AVIF везде? Всё потому что AVIF ещё молодой формат и из-за этого:

HTML код для поддержки Webp и Avif

Мы воспользуемся тегом <picture> для поддержки Webp и Avif. Он позволяет указать несколько источников для изображения, в зависимости от поддержки браузером разных форматов. И определить fallback для браузеров, которые не поддерживают Webp и Avif.

<picture>
    <source srcset="output.avif" type="image/avif">
    <source srcset="output.webp" type="image/webp">
    <img src="input.jpg" alt="input">
</picture>

Итог

Всегда используйте Webp и Avif через тег <picture>. Это фактически бесплатно с точки зрения самого сайта, но при этом вы получаете сжатые изображения, которые загружаются быстрее, расходуя меньше трафика и позволяя браузеру быстрее отрисовать страницу.