Comments 36
Но docker-image все же не удобен для использования в CI.
То есть вот у меня приложение билдится как раз в CI(то есть уже docker-in-docker) и вашу тулзу туда никак не вписать
FROM node:10-alpine as builder
COPY ./prod ./site_sources
WORKDIR /site_sources
RUN npm i
RUN npm run build
FROM nginx:1.15.8-alpine
ADD ./nginx.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
COPY --from=builder /site_sources/dist .
...
поэтому cli утилита была бы предпочтительнее, чтобы можно было сделать что-то типа
npx shakal ./dist
Предлагаю сделать PR в репозиторий, и я опубликую как пакет, после этого обновлю в статье.
Спасибо за разбор подобной ситуации, хорошо написано, но самое главное, как мне кажется, было пропущено: производительность разархивации.
Вы сжали brotli на максимальном уровне, а тестировали ли вы разархивацию на среднем бюджетном мобильном телефоне?
Мы пока только задумались о внедрении такой фичи (conditional compressing и conditional caching), так что нет. Ваша статья довольно вовремя)
Вы пишете "Время на декомпрессию, исходя из статьи, осталось прежним", но на графике из статьи ясно видно, что время на декомпрессию brotli на 15-20% медленнее, чем в случае с gzip. Так что это может вывести в ноль эффект от "Время загрузки уменьшилось на 10-12%".
Всё будет зависеть от соотношения скорости интернета и быстродействия CPU на конкретном устройстве.
Степень сжатия не влияет на скорость распаковки.
Поднимать V8 в докер контейнере только для того, чтобы вызвать консольную утилиту. Фронтенд такой фронтенд.
графики нагляднее табличек
const CompressionPlugin = require('compression-webpack-plugin');
...
new CompressionPlugin({
filename: '[path].br[query]',
algorithm: 'brotliCompress',
test: /\.(html|css|ttf|eot|svg|js)$/,
compressionOptions: { level: 11 },
threshold: 1024,
minRatio: 0.8,
}),
new CompressionPlugin({
filename: '[path].gz[query]',
test: /\.(html|css|ttf|eot|svg|js)$/,
threshold: 1024,
minRatio: 0.8,
}),
...
(Ну и да, кастомно собранный nginx с поддержкой brotli тоже нужен)
По поводу npm-пакета. Почему стандартный модуль zlib
указан в зависимостях? Также в zlib
есть поддержка brotli
, начиная, если не путаю, с node 11
. Так что утилиту можно было бы разработать полностью без зависимостей.
А уж как оно всё шикарно тормозит после разжатия.
PS Ещё очень резануло про gzip и 1992 год. Как будто это что-то плохое. В те времена решения в IT делали качественно хоть и не всегда дальновидно.
Вместо того, чтобы писать лёгкий и производительный код
Это так написано, как будто написание производительного кода занимает столько же усилий, сколько и медленного, и все пишут медленно только из вредности.
Конечно, лучше быть богатым и здоровым, а ещё сразу писать оптимизированный код, с учетом всех будущих фич и изменений.
Реакт весьма производителен. Но на нём как понаписывают, аж за голову берёшься.
Медленный код появляется из-за низкой квалификации
Нет, он появляется из-за того, что затраты на медленный код меньше, чем на быстрый. Если вы готовы выложить за проект в Х раз больше — да не вопрос, будет код и легкий и производительный, и какой захотите, хоть с украшениями в виде ascii-арта. Кто платит, тот и музыку заказывает.
что затраты на медленный код меньше, чем на быстрый
Что вы здесь подразумеваете под "затратами"? Если то что квалифицированный специалист хочет большую зарплату чем неквалифицированный, то вы только что согласились с утверждением что медленный код появляется из-за низкой квалификации.
С этой частью все понятно, но почему вы пишете "вместо того"? Почему нельзя и то и другое?
все пишут медленно только из вредности
Никогда не приписывайте злому умыслу то, что вполне можно объяснить глупостью
А я весь функционал держу в беке — я псих? (у меня веб-приложения, а не классические сайты)
Ключевые слайды:
Полная презентация docs.google.com/presentation/d/1bw0ypsrdyC2l35Z-h65D09ABQDSZ_Ecfp02-zE6Fmqc/edit?usp=sharing
habr.com/ru/post/171181
В эпоху до докера делал наколенный скрипт, который прогонялся до переключения симлинков в директории с кодом. В принципе можно делать примерно то же самое на CI до момента упаковки в докер. Из зависимостей — gzip и brotli. Вызывать из директории с проектом. Пожмет все что уже не пожато, если файлов больше лимита в 10240 ничего делать не будет.
/path/to/scipt/scipt_name.sh
#!/bin/sh
set -e
files=$(find ! -name "*.gz" ! -name "*.br" -type f)
file_count=$(find ! -name "*.gz" ! -name "*.br" -type f | wc -l)
if [ "$file_count" -gt 10240 ]; then
echo "to many files ($file_count), cowardly exit"
exit -1
fi
echo "file count: $file_count"
for file in $files; do
if [[ ! -f "$file".gz ]]; then
echo "gzipping $file"
gzip --best -c $file > "$file".gz;
fi
if [[ ! -f "$file".br ]]; then
echo "brotling $file"
brotli --best -c $file > "$file".br;
fi
done
Примерный Dockerfile:
FROM alpine
# docker build . -t gzipper
RUN apk update && apk add brotli gzip
ADD gzipper.sh /
RUN chmod +x /gzipper.sh
CMD /gzipper.sh
запуск из докера примерно такой
docker run --rm \
-i \
-v $(pwd)/dist:/workdir \
-w /workdir \
-u $(id -u):$(id -g) \
gzipper
«Шакал»: сжимаем фронтенд