digital-garden/knowledge/dev/snippet/Оптимизация изображений.md
2024-06-13 21:01:37 +03:00

70 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags:
- зрелость/🌱
date:
- - 2023-11-20
zero-link:
- "[[00 Разработка]]"
parents:
linked:
---
Размер изображений составляет существенную часть от размера страницы. Вот уже второй день вожусь с оптимизацией изображений в блоге. До этого я [использовал скрипт, который позволяет сжать jpg и png без потерь.](https://struchkov.dev/blog/ru/image-optimization/)
Теперь решил пойти еще дальше и использовать Webp формат.
WebP - это формат сжатия изображений, разработанный компанией Google. Он использует современный алгоритм сжатия, который обеспечивает более эффективное сжатие, чем форматы JPEG и PNG, что может привести к быстрее загрузке веб-страниц и экономии интернет-трафика.
В итоге пришел к такому кейсу:
1. Прогоняю [скриптом сжатия без потерь.](https://struchkov.dev/blog/ru/image-optimization/)
2. Прогоняю скриптом для преобразования в webp. Сохраняю все изображения в отдельную папку.
3. Nginx пытается сначала найти webp изображение, если не получается, то берет сжатый png или jpg
А вот и сам скрипт для преобразования в webp:
```shell
#!/bin/bash
file=webp.flag
if [ -f "$file" ]; then
option="-newer $file"
fi
find ./struchkov.dev/www/images/ -type f -iregex '.*\.\(jpg\|jpeg\|png\)' $option -exec sh -c '
webp_file="${1/\/images\//\/images\/webp\/}"
webp_dir="$(dirname "$webp_file")"
mkdir -p "$webp_dir"
cwebp -mt -af -progress -m 6 -q 85 -pass 10 "$1" -o "${webp_file%.*}.webp"
' _ {} \;
touch "$file"
echo "$(date)" > "$file"
```
Также как и в первом скрипте, я использую файл-флаг, чтобы не преобразовывать файлы, которые уже преобразовывались.
Далее я беру папку `/struchkov.dev/www/images/`, в которой лежат исходные изображения и создаю новую папку `/struchkov.dev/www/images/webp`. Внутри папки `webp` структура папок и файлов такая же, как и в папке `images`. Только формат у файлов `.webp`.
За преобразование отвечает команда `cwebp`. Эта утилита сжимает изображения, но с потерями в качестве. Я подобрал оптимальные параметры сжатия, чтобы потеря качества была не заметна, но при этом изображения занимали меньше места.
```shell
cwebp -mt -af -progress -m 6 -q 85 -pass 10 "$1" -o "${webp_file%.*}.webp"
```
Подробнее об этих и других параметрах можно [почитать в документации](https://developers.google.com/speed/webp/docs/cwebp?hl=ru).
## Nginx
Теперь сделаем так, чтобы при запросе jpg/png изображения отдавался аналогичный webp файл. Для этого в конфигурацию nginx добавляем:
```
location ~* ^(/blog/ru/content/images/)(.+)\.(png|jpe?g)$ {
expires max;
alias /var/struchkov.dev/ghost/www/images;
set $webp_image_subdir "/webp/";
set $basename $2;
try_files $webp_image_subdir$basename$webp_suffix $uri;
}
```
`try_files` сначала попытается достать webp изображение, если его нет, то возьмет сжатый оригинал формата jpg/png.