Google Closure Compiler - уникальный инструмент, разработанный Google для сжатия и обфускации собственного javascript.
У него есть ряд интересных особенностей, которые отличают его от прочих упаковщиков.
Вместе с этим, инструмент это достаточно сложный. Основные его фичи скрываются в продвинутом режиме сжатия, для применения которого нужны соответствующие навыки и стиль программирования.
Google Closure Compiler написан на языке Java, причем так, что его достаточно просто расширить - конечно, если вам знакомы понятия компилятора, синтаксического дерева и понятен Java.
Официальная документация находится на http://code.google.com/intl/ru/closure/compiler/docs/overview.html.
На момент написания этой статьи, она, как и сам компилятор, еще в процессе разработки. Во всяком случае, такие слова я слышал от разработчиков компилятора, да и общее состояние текстов и кода на это похоже.
В этом введении мы разберем основные опции компилятора и осуществим компиляцию простых примеров.
Существует 3 способа запуска компилятора:
Этот способ удобен, чтобы поиграться с оптимизациями, понять от чего чего бывает, не более.
Документация по этому способу: http://code.google.com/intl/ru/closure/compiler/docs/gettingstarted_ui.html.
Этот способ - самый гибкий. Он не только не требует наличия интернет,
но и допускает использование собственной сборки компилятора, которая использует внутренние опции, недоступные для флагов.
Сделаем небольшое упражнение по сжатию javascript-файла при помощи приложения Google Closure Compiler.
Для него вам понадобится Java Runtime Environment версии 6.
Этот пример содержит основные шаги для сжатия с использованием Google Closure Compiler.
closure-compiler.closure-compiler.hello.js:
/* простая функция */
function hello(longName) {
alert('Hello, ' + longName);
}
hello('New User');
Сохраните его в директории closure-compiler.
java -jar compiler.jar --js hello.js --js_output_file hello-compiled.js
Она сгенерирует новый файл hello-compiled.js, который содержит следующий код:
function hello(a){alert("Hello, "+a)}hello("New User");
Заметьте, что компилятор удалил комментарии, пробелы и лишнюю точку с запятой. Кроме того, он заменил параметр longName на более короткое имя a. В результате получили намного меньший javascript-файл.
Чтобы убедиться, что получившийся файл работает корректно, подключите hello-compiled.js в HTML наподобие следующего:
<html>
<head><title>Hello World</title></head>
<body>
<script src="hello-compiled.js"></script>
</body>
</html>
Загрузите этот HTML-файл в браузер и вы должны увидеть дружеский привет!
Полный список флагов будет выведен при запуске:
java -jar compiler.jar --help
Он довольно длинный и, поначалу, большинство опций будут непонятны.
В этом разделе мы разберем самые основные опции сжатия, которые позволят сразу же делать основные операции по оптимизации javascript.
--js script1.js --js script2.js ...
В результате получится объединенный сжатый файл.
Все флаги, которые допускают многократное использование, объявляются именно так. То есть, аргументы идут не через запятую, не через точку с запятой, а именно так: много раз один и тот же флаг.
Более подробно о проверке типов вы можете прочитать в статье Объявление и проверка типов в примерах
Основные оптимизации раскрыты в статьях Оптимизации стандартного режима и Продвинутые оптимизации.
--formatting PRETTY_PRINT.Чтобы ответить на этот вопрос, необходимо перечислить основные способы сжатия javascript. Их всего несколько:
Получается такой недо-gzip. Вроде архивация, но слабая. Поэтому этот способ не рекомендуется использовать одновременно с реальным gzip: получится двойное сжатие слабым, а затем сильным алгоритмом. В результате - размер больший, чем просто gzip.
Кроме того, на браузер ложится дополнительная нагрузка по разархивации полученного javascript.
При сжатии этим методом оптимизатор сначала читает javascript в синтаксическое дерево. Затем он проходит по полученному дереву, заменяет локальные переменные на более короткие и производит оптимизации. Потом по оптимизированному дереву оптимизатор генерирует код, уже с оптимизациями.
Этот способ заведомо превосходит и делает ненужным первый, т.к. знание о структуре кода, получаемое из синтаксического дерева - более правильное и полное, чем из регэкспов.
Google Closure Compiler, как и другие оптимизаторы последнего поколения, не использует регекспов и не производит архивацию (да, с этим прекрасно справляется серверный gzip).
В чем же отличия Google Closure Compiler от других аналогичных оптимизаторов, таких как ShrinkSafe и YUI Compressor?
Отличие кроется в подходе к оптимизации.
В то время как YUI Compressor использует локальные оптимизации, то Google Closure Compiler использует комплексный анализ кода.
Он выполняет гораздо больше оптимизаций, чем и обусловлен лучший результат.
Кроме того, у Google Closure Compiler есть продвинутые оптимизации, аналога которым в других оптимизаторах нет. Есть там и расширенная проверка типов и множество других интересных возможностей, за более подробным описанием которых вы можете обратиться к другим статьям этого раздела.
YUI Compressor работает безопаснее и стабильнее для некоторых видов синтаксических конструкций (eval/with/CC, см. подробнее в статье Оптимизации стандартного режима), но если понимать, что происходит, то и Google Closure Compiler может быть не менее безопасен.
На момент написания статьи, Google не опубликовала утилит для сжатия CSS, а вот YUI Compressor это умеет. Так что выбрасывать его пока рановато.
Но вот для сжатия javascript лучше Google Closure Compiler найти что-либо сложно. Во всяком случае, в открытом доступе
Для сборки компилятора подойдет практически любая ОС, т.к. используются только кросс-платформенные инструменты.
Чтобы собрать компилятор самостоятельно, его исходный код можно получить из SVN. Если у вас установлен стандартный SVN-клиент, то для этого подойдет команда:
svn co http://closure-compiler.googlecode.com/svn/trunk compiler
Последняя версия компилятора будет сохранена в директорию compiler.
Чтобы собрать компилятор, вам понадобится JDK версии 6 и установленный ANT.
Установка ANT довольно проста и описана в статье Installing Ant.
Для запуска достаточно запустить ant в директории с файлом сборки build.xml. После этого готовый к использованию jar-файл будет лежать в директории build.
Если после этого введения какие-то базовые вещи что-то осталось неясными - напишите в комментариях, отвечу. Спасибо.