You've successfully subscribed to Заметки Разработчиков
Great! Next, complete checkout for full access to Заметки Разработчиков
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
Success! Your billing info is updated.
Billing info update failed.

optimization

Оптимизация изображений

Размер изображений составляет существенную часть от размера страницы. Вот уже второй день вожусь с оптимизацией изображений в блоге. До этого я использовал скрипт, который позволяет сжать jpg и png без потерь. Теперь решил пойти еще дальше и использовать Webp формат. WebP - это формат сжатия изображений, разработанный компанией Google. Он

Размер изображений составляет существенную часть от размера страницы. Вот уже второй день вожусь с оптимизацией изображений в блоге. До этого я использовал скрипт, который позволяет сжать jpg и png без потерь.

Теперь решил пойти еще дальше и использовать Webp формат.

WebP - это формат сжатия изображений, разработанный компанией Google. Он использует современный алгоритм сжатия, который обеспечивает более эффективное сжатие, чем форматы JPEG и PNG, что может привести к быстрее загрузке веб-страниц и экономии интернет-трафика.

В итоге пришел к такому кейсу:

  1. Прогоняю скриптом сжатия без потерь.
  2. Прогоняю скриптом для преобразования в webp. Сохраняю все изображения в отдельную папку.
  3. Nginx пытается сначала найти webp изображение, если не получается, то берет сжатый png или jpg

А вот и сам скрипт для преобразования в webp:

#!/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. Эта утилита сжимает изображения, но с потерями в качестве. Я подобрал оптимальные параметры сжатия, чтобы потеря качества была не заметна, но при этом изображения занимали меньше места.

cwebp -mt -af -progress -m 6 -q 85 -pass 10 "$1" -o "${webp_file%.*}.webp"

Подробнее об этих и других параметрах можно почитать в документации.

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.

JDK для Apple M1 (Silicon)

Если вы владелец Macbook на базе Apple Silicon, убедитесь что используете подходящую версию JDK. Это ускорит сборку проекта более чем в 4 раза.

Если вы владелец Macbook-а на базе Apple Silicon, то рекомендую проверить вашу версию Java. Возможно вы используете обычную JDK, вместо сборки под Apple Silicon.

Такой случай оказался у меня. Когда-то давным давно скачал JDK, работает и ладно. Посмотрел доклад про нативные сборки, и там упоминалось про JDK для Apple Silicon. Решил проверить, а такой ли у меня. Оказалось не такой.

В итоге вот сколько собирался большой монолит (с генерацией javadoc), состоящий из 22 модуля на обычной JDK. Все зависимости были закачены заранее и сборка была запущена в многопоточном режиме maven-а.

И вот сколько на JDK для Apple Silicon:

Также после перехода log работы maven стал цветной :D
Сборка стала быстрее в 4 раза!
Генерация javadoc

Проект собирался без генерации javadoc. С генерацией JavaDoc сборка была быстрее всего в 1,6 раза. В целом нет смысла запускать локальную сборку с генерацией javadoc.

Поэтому проверьте, какой версией пользуетесь вы. Должна быть aarch64, как на скрине.