Компилятор Closure позволяет выбрать один из трех уровней компиляции: от простого удаления пробелов и комментариев до агрессивных преобразований кода.
ТОЛЬКО БЕЛОЕ_ПРОСТРАНСТВО
Уровень компиляции WHITESPACE_ONLY
удаляет из кода комментарии, а также переносы строк, ненужные пробелы, лишние знаки препинания (например, скобки и точки с запятой) и другие пробелы. Выходной JavaScript-код функционально идентичен исходному JavaScript.
Транспиляция языковых функций всё равно будет выполнена, даже если запрошенный режим выходного языка отличается от режима входного языка. См. --language_in
и --language_out
в разделе Флаги и параметры .
Этот уровень компиляции обеспечивает наименьшее сжатие из трех уровней.
ПРОСТЫЕ_ОПТИМИЗАЦИИ
Уровень компиляции SIMPLE_OPTIMIZATIONS
выполняет то же удаление пробелов и комментариев, что и WHITESPACE_ONLY
, но также выполняет оптимизацию внутри выражений и функций, включая переименование локальных переменных и параметров функций в более короткие имена. Переименование переменных в более короткие имена значительно сокращает размер кода. Поскольку уровень SIMPLE_OPTIMIZATIONS
переименовывает только символы, локальные для функций, он не мешает взаимодействию между скомпилированным JavaScript и другим JavaScript.
Компиляция с помощью SIMPLE_OPTIMIZATIONS
всегда сохраняет функциональность синтаксически правильного JavaScript, при условии, что код не обращается к локальным переменным с использованием строковых имен (например, с помощью операторов eval()
или путем вызова toString в функциях).
SIMPLE_OPTIMIZATIONS
— уровень компиляции по умолчанию.
РАСШИРЕННЫЕ_ОПТИМИЗАЦИИ
Уровень компиляции ADVANCED_OPTIMIZATIONS
выполняет те же преобразования, что и SIMPLE_OPTIMIZATIONS
, но добавляет ряд более агрессивных глобальных преобразований для достижения максимального сжатия среди всех трёх уровней. Уровень ADVANCED_OPTIMIZATIONS
сжимает JavaScript значительно лучше, чем другие инструменты.
Для обеспечения такого экстремального сжатия ADVANCED_OPTIMIZATIONS
делает строгие предположения о скомпилированном коде. Если ваш код не соответствует этим предположениям, ADVANCED_OPTIMIZATIONS
создаст код, который не будет работать.
Например, код, скомпилированный с ADVANCED_OPTIMIZATIONS
может не работать с нескомпилированным кодом, если вы не предпримете специальных мер для обеспечения совместимости. Если вы не отметите внешние функции и свойства, на которые ссылается ваш код, Closure Compiler неправильно переименует ссылки в вашем коде, что приведет к несоответствию имён в вашем коде и во внешнем коде.
Чтобы узнать больше о подготовке кода для ADVANCED_OPTIMIZATIONS
, прочтите статью Advanced Compilation and Externs .
Преобразования ADVANCED_OPTIMIZATIONS
включают в себя:
- более агрессивное переименование:
Компиляция с
SIMPLE_OPTIMIZATIONS
переименовывает только параметры и переменные внутри функций.ADVANCED_OPTIMIZATIONS
также переименовывает глобальные переменные, имена функций и свойства. - удаление мертвого кода:
Компиляция с
ADVANCED_OPTIMIZATIONS
удаляет код, который заведомо недостижим. Это особенно полезно в сочетании с большими библиотеками. Если вы используете лишь несколько функций из большого файла библиотеки, компилятор может удалить из вывода всё, кроме этих функций. - глобальное встраивание:
Компиляция с
ADVANCED_OPTIMIZATIONS
заменяет некоторые вызовы функций телом функции. Это преобразование называется «встраиванием». Компилятор встраивает функции только в тех случаях, когда считает, что встраивание безопасно и экономит место. Компиляция сADVANCED_OPTIMIZATIONS
также встраивает константы и некоторые переменные, когда компилятор считает, что это безопасно.
Как установить уровень компиляции
Чтобы установить уровень компиляции в приложении Closure Compiler, включите флаг командной строки --compilation_level
со значением WHITESPACE_ONLY
, SIMPLE
или ADVANCED
, как в следующей команде:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js