Компиляция 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». Далее мы можем использовать минифицированный скрипт по своему усмотрению.