Компиляция js. Google Closure Compiler (Docker)
В рамках оптимизации сайта «Ящик Пандоры», понадобилось компилировать ява скрипты на лету. Для этого можно использовать Докер контейнер с Google Closure Compiler.
Dockerfile контейнера достаточно прост:
FROM alpine:3.5 COPY resources/cc.sh /opt/cc.sh RUN apk add --no-cache --update openjdk8-jre curl unzip \ && curl https://dl.google.com/closure-compiler/compiler-20200719.zip >> /tmp/cc.zip \ && unzip -d /tmp /tmp/cc.zip c*.jar \ && cp /tmp/c*.jar /opt/closure-compiler.jar \ && rm /tmp/c*.jar \ && chmod +x /opt/cc.sh ENTRYPOINT ["/opt/cc.sh"]
Копируем последнюю версию gcc и запускаем cc.sh, со следующим содержимым:
#!/bin/sh -e CC="/opt/closure-compiler.jar" exec java -jar $CC $*
Собранный контейнер можно скопировать отсюда https://hub.docker.com/r/brahman/gcc
Для того, чтобы с помощью этого контейнера компилировать свои ява скрипты, напишем простой шелл-скрипт jsmin.sh:
#!/usr/bin/env bash # По умолчанию ищем файлы в текущей директории work_dir=`pwd` if [ -n "$1" ]; then # Смотрим, назначена ли директория в переменной work_dir=$1 fi min_continue=".min.js" for file in `find $work_dir -name '*.js'`; do # Получаем имя файла name="${file##*/}" if [[ "$name" == *"$min_continue"* ]]; then # min-файл уже есть continue else min_name="${name//".js"/".min.js"}" min_path="$work_dir/$min_name" if [ -f $min_path ]; then echo "Фай '$min_name' уже есть." else echo "Файл '$min_name' не найден. Компилируем" `docker run -i --rm -v $work_dir:/opt/scripts brahman/gcc --js /opt/scripts/$name --js_output_file /opt/scripts/$min_name`; fi fi done
Запуск скрипта осуществляется командой:
bash jsmin.sh /your/file/path
По умолчанию скрипт ищет файлы в своём каталоге. Можно указать внешний каталог в качестве аргумента, в нашем случае это «/your/file/path».
Скрипт компилирует все js файлы, которые находит в каталоге, не содержащие в имени «.min.js».
Например, если необходимо откомпилировать «custom.js», находящийся в папке «var/www/custom/js», следует запустить скрипт компиляции командой:
bash jsmin.sh /var/www/custom/js
При запуске докер-контейнера, следите за тем, чтобы ваш пользователь имел право на такой запуск.
После компиляции, в целевой папке появляется файл «custom.min.js». Далее мы можем использовать минифицированный скрипт по своему усмотрению.