Pull to refresh

Comments 36

Попробовал, классно, спасибо!
Но docker-image все же не удобен для использования в CI.
То есть вот у меня приложение билдится как раз в CI(то есть уже docker-in-docker) и вашу тулзу туда никак не вписать
CI docker image
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
Классная идея! В нашем CI в основном нет multi-stage сборок, поэтому не столкнулись с такой проблемой.
Предлагаю сделать PR в репозиторий, и я опубликую как пакет, после этого обновлю в статье.
Принял ваш PR, опубликовал пакет в NPM и обновил статью в разделе «Ссылки». Спасибо вам большое!

Спасибо за разбор подобной ситуации, хорошо написано, но самое главное, как мне кажется, было пропущено: производительность разархивации.
Вы сжали brotli на максимальном уровне, а тестировали ли вы разархивацию на среднем бюджетном мобильном телефоне?

К сожалению, нет, своих экспериментов мы не проводили, но изучали статьи на эту тему, например, ссылка из моей статьи. У вас есть наработки по таким экспериментам, можете поделиться?

Мы пока только задумались о внедрении такой фичи (conditional compressing и conditional caching), так что нет. Ваша статья довольно вовремя)

Вы пишете "Время на декомпрессию, исходя из статьи, осталось прежним", но на графике из статьи ясно видно, что время на декомпрессию brotli на 15-20% медленнее, чем в случае с gzip. Так что это может вывести в ноль эффект от "Время загрузки уменьшилось на 10-12%".
Всё будет зависеть от соотношения скорости интернета и быстродействия CPU на конкретном устройстве.

Степень сжатия не влияет на скорость распаковки.

Спасибо, мил человек, что заметили это безумие. Ну серьёзно. Цензурных выражений не хватает.

Напрашивается внедрение блокчейна!

Сокращение времени доставки артефактов это, конечно, здорово, но хотелось бы видеть облегчение того, что доставляете. Да-да, я именно про код, который будет исполняться у меня на машине. Минификация кода не делает его легче для виртуальной машины JS, в результате обычный сайт подлагивает при прокрутке. Вот в первую очередь хотелось бы читать статьи об оптимизации JS, например, о сокращении использования «современных инструментов» там, где им не место, а уж интернет у меня безлимитный, не обломлюсь загрузить.
Если сборка проекта через webpack, то можно просто добавить в конфиг это:
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. Так что утилиту можно было бы разработать полностью без зависимостей.

Можно и без зависимостей. В случае с докер образом решается очень просто, однако как cli для npm будут проблемы – минимальная нода 11. С одной стороны – это два мажора назад, с другой – есть разработчики и с 10.
Вместо того, чтобы писать лёгкий и производительный код, в современном фронтенде принято выдумать всё новые методы переложить проблемы с больной головы на здоровую. Вот и более лучшее сжатие (в угоду чего? процессор конечно же).

А уж как оно всё шикарно тормозит после разжатия.

PS Ещё очень резануло про gzip и 1992 год. Как будто это что-то плохое. В те времена решения в IT делали качественно хоть и не всегда дальновидно.
Вместо того, чтобы писать лёгкий и производительный код

Это так написано, как будто написание производительного кода занимает столько же усилий, сколько и медленного, и все пишут медленно только из вредности.


Конечно, лучше быть богатым и здоровым, а ещё сразу писать оптимизированный код, с учетом всех будущих фич и изменений.

Медленный код появляется из-за низкой квалификации и незнания ключевых особенностей javascript и работы с DOM. Проблема во фронте в том, что сюда очень низкий порог входа, к сожалению.
Реакт весьма производителен. Но на нём как понаписывают, аж за голову берёшься.
Доля правды в этом есть. Встречал у нас на работе специалиста который всю жизнь писал на беке и тут решил на js написать часть со словами, а там всё просто. Так для того чтобы сделать «динамическую форму» он отправлял на сервере в сесии всю таблицу всё делал на сервере и на клиенте назад принимал сессию (не json). Кто угадает что он делал на клиенте, правильно ajax на jquery. А что он делал на сервере, правильно сортировку и математические вычисления. Странно почему код тормозил.
Медленный код появляется из-за низкой квалификации

Нет, он появляется из-за того, что затраты на медленный код меньше, чем на быстрый. Если вы готовы выложить за проект в Х раз больше — да не вопрос, будет код и легкий и производительный, и какой захотите, хоть с украшениями в виде ascii-арта. Кто платит, тот и музыку заказывает.

что затраты на медленный код меньше, чем на быстрый

Что вы здесь подразумеваете под "затратами"? Если то что квалифицированный специалист хочет большую зарплату чем неквалифицированный, то вы только что согласились с утверждением что медленный код появляется из-за низкой квалификации.

Да, специалист высокой квалификации не будет делать детских ошибок вида отсортировать массив и потом взять первый элемент для максимума, но, в любом случае, как только требуется реальная быстрота разработка замедляется в разы и десятки раз. Требуется всё это профилировать, потом просовывать через апи и слои абстракции быстрые но неудобные интерфейсы, требуется тщательный, часто с тестами, выбор алгоритма, игры с параметрами, применение всяких object pool и прочих техник оптимизации. И код от этого становится хуже, отладка затрудняется, требуется больше тестов и инструментов для стабилизации этого кода (статический анализ, фаззеры, санитайзеры, всякие Electric Fence и прочие Valgrind) И один и тот же высококлассный специалист, в зависимости и тз и условий выдаст код разной производительности за разное время, а цена от времени пляшет. Когда речь идёт плохо или средне, да, зависимость от квалификации. Кода нужна экстра производительность нужен спец экстра класса. Но спец экстра класса лего и непринуждённо с хорошей скоростью выдаёт средний код не напрягаясь.
Когда речь идёт плохо или средне, да, зависимость от квалификации. Когда нужна экстра производительность нужен спец экстра класса

Ну то есть зависимость есть на всём диапазоне, я не понял зачем вы выделили "экстра/реальную" производительность в отдельную группу.

С этой частью все понятно, но почему вы пишете "вместо того"? Почему нельзя и то и другое?

Там в комментарии это был сарказм

А я весь функционал держу в беке — я псих? (у меня веб-приложения, а не классические сайты)

И даже к примеру списки для select2 в 1000 позиций вы отдаёте беком в html?

Если вы попробовали разные варианты, и держать все на беке сработало лучше всего, то дело ваше, как вам удобнее.


А если вы не еще пробовали, то почему бы не попробовать, вдруг что-то улучшится?

О, кто-то это таки написал, а то я на докладе пообещал, да так и не написал. Более подробно про сжатие разных видов за 20 минут в моём докладе
29:06 если таймкод не сработает.
Ключевые слайды:
image
image
Полная презентация docs.google.com/presentation/d/1bw0ypsrdyC2l35Z-h65D09ABQDSZ_Ecfp02-zE6Fmqc/edit?usp=sharing

Слышали. Лучше, чем что сжимает? Чем gzip – да, но не лучше brotli. Если есть примеры, что zopfli лучше brotli, то скидывай. Можно в личку.
У brotli встроенный словарь есть, так что лучше него еще ничего не придумали.

В эпоху до докера делал наколенный скрипт, который прогонялся до переключения симлинков в директории с кодом. В принципе можно делать примерно то же самое на 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
Sign up to leave a comment.