Кодеки сжатия
Решение
Заранее сжимать выбранные файлы с помощью Brotli Q11 и Gzip 9. Нормализовать байт ОС в заголовке gzip до 0xFF. Точные правила отбора файлов описаны в результате сжатия.
Контекст
Конфигурация хостинга выбирает готовое представление по Accept-Encoding. Сжатие выполняется при сборке, поэтому серверу не нужно повторять эту работу для каждого запроса.
Альтернативы
Только Brotli. Клиент, который не принимает Brotli, получит исходный файл. Gzip даёт дополнительное сжатое представление.
Третий кодек, например zstd. Ещё одно представление потребует изменений сжатия, согласования форматов и публикации. Его пользу нужно подтвердить измерениями на характерном наборе файлов и требованиями целевых клиентов.
Общие словари. Представление, зависящее от словаря, потребует согласованного словаря и другого контракта доставки. Текущий артефакт содержит файлы, которые декодируются независимо.
Аргумент
Для двух кодеков генераторы конфигурации задают фиксированный порядок: Brotli, Gzip, исходный файл. Это реализованный контракт артефакта; решение не означает, что Brotli превосходит любой другой кодек на любых данных.
Нормализация байта 9 заголовка gzip устраняет одно поле метаданных, зависящее от платформы. Для совпадения сжатых байтов также нужны одинаковые входные данные и совместимые версии рантайма и компрессора. Стабильные байты позволяют избежать лишних изменений при публикации по манифесту.
Последствия
Для каждого выбранного непустого файла создаются копии .br и .gz в плоских каталогах сжатия. Файлы отбираются по имени: поддерживаемому расширению или точному хэшированному имени без расширения. Другие имена, robots.txt и пустые файлы исключены. Исходники остаются доступными.
Добавление кодека меняет контракт артефакта и хостинга. До такого изменения нужно сохранить результаты измерений и требования клиентов.