JavaScript Пишем скрипт для использования онлайн-сервиса Google Closure Compiler из командной строки UNIX

Ни для кого не секрет, что одним из важных шагов при оптимизации javascript на сайтах, является минимизация исходных скриптов. На данный момент основными инструментами для сжатия javascript являются yui-compressor (утилита для командной строки в UNIX-подобных системах), packer от Dean Edwards (онлайн-сервис) и Google Closure Compiler — наиболее продвинутый на данный момент инструмент (существует как онлайн-версия, так и свободное java-приложение, запускаемое из командной строки). Однако с запуском java-приложение не в UNIX-подобной операционной системе могут возникнуть сложности, так как для своей работы оно потребует эмуляции через Cygwin. Однако существует и альтернативный способ сделать кроссплатформенную утилиту для командной строки — это использовать онлайн-сервис Google Closure Compiler прямо из командной строки.

Для этого нам понадобится php5 с модулями php5-cli и php5-curl, что сделает нашу утилиту кроссплатформенной. Установку и использование утилиты я буду описывать с точки зрения linux-подобных операционных систем семейства Debian.

Начнем с того, что если php5 с нужными модулями не установлен, то набираем в терминале команду:

sudo aptitude install php5 php5-cli php5-curl

Затем создаем скрипт, который будет отправлять POST-запросом исходные коды javascript на страницу с онлайн-сервисом Google Closure Compiler и возвращать нам оптимизированный и сжатый код. Я назвал скрипт gcconline, но можно подобрать ему любое другое название.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/php
<?php
    // Этот скрипт зависит от пакетов: php5 php5-cli php5-curl
    if ($argc > 1) {
        // Определяем рабочую директорию
        $cd = getcwd();
        // Определяем вид слешей
        define('DS', DIRECTORY_SEPARATOR);
        // Определяем индекс последнего параметра (название входного файла)
        $last_index = $argc - 1;
        // Устанавливаем степень сжатия скрипта по умолчанию
        $compilation_level = 'ADVANCED_OPTIMIZATIONS';
        // Читаем параметры
        for ($i = 1; $i < $last_index; $i++) {
            // Настраиваем скрипт согласно параметрам
            switch ($argv[$i]) {
                case '-w':    // WHITESPACE_ONLY
                    $compilation_level = 'WHITESPACE_ONLY';
                    break;
                case '-s':    // SIMPLE_OPTIMIZATIONS
                    $compilation_level = 'SIMPLE_OPTIMIZATIONS';
                    break;
                case '-o':    // Выходной файл
                    $output_filename = $cd.DS.$argv[++$i];
                    break;
            }
        }
        // Получаем название файла, который необходимо сжать
        $input_file = $cd.DS.$argv[$last_index];
        // Читаем содержимое входного файла
        $input_content = '';
        if (file_exists($input_file))
            $input_content = file_get_contents($input_file);
        else {
            echo 'File `'.$input_file.'` not found'.chr(10);
            // Если не найден входной файл - возвращаем 2
            exit(2);
        }
        // Инициализируем POST-запрос
        $request = curl_init();
        // Задаем параметры POST-запроса
        $post_data = 'compilation_level='.$compilation_level
            .'&output_format=text'
            .'&output_info=compiled_code'
            .'&js_code='.urlencode($input_content);
        // Открываем файл, куда запишем ответ от сервера
        $output_file = fopen(!isset($output_filename) ?
                             $cd.DS.'gcconline.min.js' :
                             $output_filename, 'w');
        // Задаем параметры запроса через cURL
        curl_setopt_array($request, array(
            CURLOPT_URL        => 'http://closure-compiler.appspot.com/compile',
            CURLOPT_FILE       => $output_file,
            CURLOPT_POST       => 1,
            CURLOPT_POSTFIELDS => $post_data,
        ));
        // Выполняем запрос к онлайн-сервису Google Closure Compiler
        $curl_status = curl_exec($request);
        // Обрабытываем ошибки подключения к Google Closure Compiler
        if (!$curl_status) {
            echo 'Unable to connect to Google Closure Compiler service. '
			    .'Check your internet connection'.chr(10);
            // Если нельзя через интернет подключиться к сервису - возвращаем 3
            exit(3);
        }
        // Если не указан выходной файл
        if (!isset($output_filename)) {
            // Выводим содержимое сжатого файла в консоль
            echo file_get_contents($cd.DS.'gcconline.min.js');
            // Удаляем временный файл
            unlink($cd.DS.'gcconline.min.js');
        }
    }
    else {
        // Инструкция по использованию скрипта
        echo 'Usage: gcconline [options] [input file]'.chr(10).chr(10)
            .'Options'.chr(10)
            .'  -a                  Advansed optimizations (default)'.chr(10)
            .'  -s                  Simple optimizations'.chr(10)
            .'  -w                  Whitespace only'.chr(10)
            .'  -o <file>           Place the output into <file>. '
			                      .'Defaults to stdout'.chr(10)
 
            ;
        // Если скрипт запущен без параметров - возвращаем 1
        exit(1);
    }
 
    // Если скрипт отработал без ошибок - возвращаем 0
    exit(0);

Код хорошо прокомментирован, поэтому надеюсь, что проблем с его понимаем не возникнет. Этот скрипт также можно скачать из репозитория на github. После создания или скачивания, рекомендую поместить скрипт в каталог /usr/bin, назначить его владельцем пользователя root и выставить ему права 755. Если скрипт скачался в домашний каталог, то последовательность команд будет такой:

sudo mv ~/gcconline /usr/bin/gcconline
sudo chown root:root /usr/bin/gcconline
sudo chmod 755 /usr/bin/gcconline

Далее можно приступать к практическому использованию скрипта. Параметры, описывающие имена входного и выходного файлов, аналогичны параметрам утилиты yui-compressor. Поэтому, самым распространенным вариантом команды будет, например, такой:

gcconline -o jquery.min.js jquery.js

Эта команда использует в качестве исходного файла скрипт jquery.js и после окончания своей работы выдаст скрипт, сжатый с настройками «Advansed optimizations». Также можно использовать варианты команд:

gcconline -s -o jquery.min.js jquery.js
gcconline -w -o jquery.min.js jquery.js

Первый вариант команды использует упрощенную оптимизацию «Simple optimizations» и размер сжатого файла в этом случае получится больше, чем при использовании «Advansed optimizations». Второй вариант команды никакой оптимизации проводить не будет, а просто вырежет из скрипта все пробелы, знаки табуляции и переносы строк.

Как и в случае использования утилиты yui-compressor, команда следующего вида выведет содержимое сжатого файла в консоль (stdout).

gcconline jquery.js

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