Компилятор закрытия - это инструмент для загрузки JavaScript и запуска быстрее. Это настоящий компилятор для JavaScript. Вместо того, чтобы собирать из исходного языка в машинный код, он собирает от JavaScript для лучшего JavaScript. Он анализирует ваш JavaScript, анализирует его, удаляет мертвый код, переписывает и сводит к минимуму то, что осталось. Он также проверяет синтаксис, переменные ссылки и типы, а также предупреждает об общих ловушках JavaScript.
Режимы компиляции, кроме ADVANCED
всегда были запоздалой мыслью, и мы установили эти способы. Мы считаем, что другие инструменты работают сравнительно для не ADVANCED
режимов и лучше интегрированы в более широкую экосистему JS.
Компилятор закрытия не подходит для произвольного JavaScript. Для ADVANCED
режима для генерации работающего JavaScript, код ввода JS должен быть записан с учетом закрытия.
Компилятор закрытия - это оптимизатор «всего мира». Он ожидает напрямую увидеть или, по крайней мере, получить информацию о каждом возможном использовании каждой глобальной или экспортируемой переменной и каждого имени свойства.
Он будет агрессивно удалять и переименовать переменные и свойства, чтобы сделать выходной код максимально небольшим. Это приведет к разбитую выходу JS, если использование глобальных переменных или свойств будет скрыто от него.
Хотя можно написать пользовательские файлы Evens, чтобы сообщить компилятору оставить некоторые имена без изменений, чтобы их можно было безопасно получить по коду, который не является частью компиляции, это часто утомительно поддерживать.
Переименование свойства компилятора закрытия требует, чтобы вы последовательно получали доступа к собственности с obj[p]
или obj.propName
, но не оба.
Когда вы получаете доступ к свойству с квадратными кронштейнами (например, obj[p]
) или используя какой -либо другой непрямой метод, такой как let {p} = obj;
Это скрывает буквальное название имущества, на которое ссылается компилятор. Он не может знать, ссылается ли obj.propName
на то же свойство, что и obj[p]
. В некоторых случаях он заметит эту проблему и остановит компиляцию с ошибкой. В других случаях оно переименован в propName
в нечто более короткое, не замечая эту проблему, что приведет к разбитым результатам кода JS.
Компилятор закрытия агрессивно внедряет глобальные переменные и сжимает цепочки имен свойств на глобальных переменных (например, myFoo.some.sub.property
-> myFoo$some$sub$property
), чтобы облегчить их причины для обнаружения неиспользованного кода.
Он пытается либо отступить от этого, либо остановиться с ошибкой при выполнении его выработки, но есть случаи, когда он не сможет распознать проблему и просто генерировать сломанную JS без предупреждения. Это гораздо чаще произойдет в коде, который явно не был написан с учетом закрытия компилятора.
Компилятор закрытия и внешние, которые он использует по умолчанию, предположим, что целевая среда представляет собой окно веб -браузера.
Веб -работники также поддерживаются, но компилятор, скорее всего, не сможет предупредить вас, если вы попытаетесь использовать функции, которые на самом деле не доступны для веб -работника.
Некоторые файлы и функции Externs были добавлены в компилятор закрытия для поддержки среды Nodejs, но они не поддерживаются и никогда не работают очень хорошо.
JavaScript, который не использует goog.module()
и goog.require()
от base.js
для объявления и использования модулей, не очень хорошо поддерживается.
Синтаксис import
и export
ECMASCRICT не существовал до 2015 года. Компилятор закрытия и closure-library
разработали свои собственные средства для объявления и использования модулей, и это остается единственным хорошо поддерживаемым способом определения модулей.
Компилятор реализует некоторое понимание модулей Ecmascript, но изменение проектов Google для использования более нового синтаксиса никогда не предлагало выгоду, которое стоило стоимости изменения. Код TypeScript Google использует модули ECMASCRIPT, но они преобразуются в синтаксис goog.module()
прежде чем его видит компилятор. Таким образом, эффективно поддержка модулей Ecmascript не используется в Google. Это означает, что мы вряд ли будем замечать или исправить ошибки в поддержке модулей ECMASCRICE.
Поддержка модулей CommonJS, поскольку входные данные были добавлены в прошлом, но не использовались в Google и, вероятно, будут полностью удалены где -то в 2024 году.
Компилятор закрытия используется Google Projects для:
Радикально уменьшить размер кода очень больших приложений JavaScript
Проверьте код JS на предмет ошибок и для соответствия общим и/или лучшим практикам, специфичным для проекта.
Определите видимые пользовательские сообщения таким образом, чтобы заменить их на переведенные версии для создания локализованных версий приложения.
Transpile Новые функции JS в форму, которая будет работать в браузерах, которые не имеют поддержки этих функций.
Разбейте выходное приложение на куски, которые могут быть индивидуально загружены по мере необходимости.
Примечание. Эти кусочки являются простыми сценариями JavaScript. Они не используют синтаксис import
и export
ECMASCRIPT.
Для достижения этих целей компилятор закрытия накладывает много ограничений на его вход:
Используйте goog.module()
и goog.require()
чтобы объявить и использовать модули.
Поддержка синтаксиса import
и export
, добавленного в ES6, не поддерживается активно.
Используйте аннотации в комментариях, чтобы объявить информацию типа и предоставить информацию, необходимую компилятору, чтобы избежать нарушения некоторых шаблонов кода (eg @nocollapse
и @noinline
).
Либо используйте только точечный доход (например, object.property
), либо используйте только динамический доступ (например object[propertyName]
или Object.keys(object)
), чтобы получить доступ к свойствам конкретного типа объекта.
Смешивание их будет скрывать некоторое использование свойства от компилятора, что приведет к разбитому выводному коду при переименовании свойства.
В целом компилятор ожидает увидеть целое приложение в качестве единого компиляции. Интерфейсы должны быть тщательно и явно построены, чтобы разрешить взаимодействие с кодом за пределами компиляционного блока.
Компилятор предполагает, что он может видеть все использование всех переменных и свойств, и будет свободно переименовать их или удалять, если они кажутся неиспользованными.
Используйте файлы Extreds, чтобы информировать компилятор о любых переменных или свойствах, которые он не должен удалять или переименовать.
Существуют файлы по умолчанию, объявляющие стандартные API -интерфейсы JS и DOM Global. Больше файлов Externs необходимо, если вы используете менее распространенные API или ожидаете некоторого внешнего кода JavaScript для доступа к API в коде, который вы компилируете.
Самый простой способ установить компилятор - с NPM или пряжей:
yarn global add google-closure-compiler
# OR
npm i -g google-closure-compiler
Диспетчер пакетов свяжет для вас двоичный файл, и вы можете получить доступ к компилятору с помощью:
google-closure-compiler
Это запускает компилятор в интерактивном режиме. Тип:
var x = 17 + 25 ;
Нажмите Enter
, затем Ctrl+Z
(в Windows) или Ctrl+D
(на Mac/Linux), затем Enter
снова. Компилятор ответит скомпилированным выводом (по умолчанию с использованием SIMPLE
режима):
var x = 42 ;
Предварительно скомпилированный выпуск компилятора также доступен через Maven.
Компилятор закрытия имеет много параметров для чтения ввода из файла, написания вывода в файл, проверки вашего кода и запуска оптимизации. Вот простой пример сжатия программы JS:
google-closure-compiler --js file.js --js_output_file file.out.js
Мы получаем максимальную выгоду от компилятора, если даем ему весь наш исходный код (см. Компиляцию нескольких сценариев), что позволяет нам использовать ADVANCED
оптимизации:
google-closure-compiler -O ADVANCED rollup.js --js_output_file rollup.min.js
ПРИМЕЧАНИЕ. Вывод ниже является только примером и не поддержанным. Страница Wiki Flags and Options обновляется во время каждого выпуска.
Чтобы увидеть все параметры компилятора, тип:
google-closure-compiler --help
--flag | Описание |
---|---|
--compilation_level (-O) | Определяет уровень компиляции для использования. Параметры: BUNDLE , WHITESPACE_ONLY , SIMPLE (по умолчанию), ADVANCED |
--env | Определяет набор встроенных внешних видов нагрузки. Параметры: BROWSER , CUSTOM . По умолчанию в BROWSER . |
--externs | Файл, содержащий JavaScript Externs. Вы можете указать несколько |
--js | Имя файла JavaScript. Вы можете указать несколько. Имя флага не является обязательным, потому что ARGs интерпретируются как файлы по умолчанию. Вы также можете использовать шаблоны в стиле минимума. Например, используйте --js='**.js' --js='!**_test.js' , чтобы рекурсивно включать все файлы JS, которые не заканчиваются в _test.js |
--js_output_file | Первичное выходное имя файла. Если не указано, вывод записывается в Stdout. |
--language_in | Устанавливает языковую спецификацию, которой должны соответствовать источники ввода. Параметры: ECMASCRIPT3 , ECMASCRIPT5 , ECMASCRIPT5_STRICT , ECMASCRIPT_2015 , ECMASCRIPT_2016 ECMASCRIPT_NEXT ECMASCRIPT_2017 , ECMASCRIPT_2018 , STABLE , ECMASCRIPT_2019 |
--language_out | Устанавливает языковую спецификацию, которой должен соответствовать выход. Параметры: ECMASCRIPT3 , ECMASCRIPT5 , ECMASCRIPT5_STRICT , ECMASCRIPT_2015 , ECMASCRIPT_2016 , ECMASCRIPT_2017 , ECMASCRIPT_2018 , ECMASCRIPT_2019 , STABLE |
--warning_level (-W) | Определяет уровень предупреждения для использования. Варианты: QUIET , DEFAULT , VERBOSE |
Вы можете получить доступ к компилятору в программе JS, импортируя google-closure-compiler
:
import closureCompiler from 'google-closure-compiler' ;
const { compiler } = closureCompiler ;
new compiler ( {
js : 'file-one.js' ,
compilation_level : 'ADVANCED'
} ) ;
В большинстве случаев этот пакет обеспечит программный доступ к местному бинарному бинарству и в противном случае будет возвращаться к версии Java.
Если у вас есть несколько сценариев, вы должны составить их все вместе с одной командой компиляции.
google-closure-compiler in1.js in2.js in3.js --js_output_file out.js
Вы также можете использовать глобусы в стиле минимума.
# Recursively include all js files in subdirs
google-closure-compiler ' src/**.js ' --js_output_file out.js
# Recursively include all js files in subdirs, excluding test files.
# Use single-quotes, so that bash doesn't try to expand the '!'
google-closure-compiler ' src/**.js ' ' !**_test.js ' --js_output_file out.js
Компилятор закрытия будет объединять файлы в порядке, который они переданы в командной строке.
Если вы используете Globs или много файлов, вы можете начать столкнуться с проблемами с управлением зависимостями между сценариями. В этом случае вы должны использовать включенные lib/base.js, который обеспечивает функции для обеспечения соблюдения зависимостей между сценариями (а именно goog.module
и goog.require
). Компилятор закрытия автоматически повторно заказывает входы.
Компилятор закрытия выпускает с помощью lib/base.js, который предоставляет функции и переменные JavaScript, которые служат примитивами, позволяющими определенным функциям компилятора закрытия. Этот файл является производной идентично названной Base.js в будущей устаревшей библиотеке закрытия. Этот base.js
будет поддерживаться компилятором закрытия в будущем и может получить новые функции. Он был разработан только для того, чтобы сохранить свои воспринимаемые основные части.
Чтобы построить компилятор самостоятельно, вам понадобится следующее:
Условие | Описание |
---|---|
Java 11 или позже | Используется для составления исходного кода компилятора. |
Nodejs | Используется для создания ресурсов, используемых компиляцией Java |
Git | Используется Bazel для загрузки зависимостей. |
Базелиск | Используется для построения различных целей компилятора. |
Bazelisk - это обертка вокруг Bazel, которая динамически загружает соответствующую версию Bazel для данного репозитория. Использование его предотвращает ложные ошибки, которые возникают в результате использования неправильной версии Bazel для создания компилятора, а также позволяют легко использовать различные версии Bazel для других проектов.
Bazelisk доступен во многих менеджерах пакетов. Не стесняйтесь использовать то, что вам больше всего удобно.
Инструкции по установке Bazelisk.
$ bazelisk build //:compiler_uberjar_deploy.jar
# OR to build everything
$ bazelisk build //:all
Тесты могут быть выполнены аналогичным образом. Следующая команда будет запускать все тесты в репо.
$ bazelisk test //:all
Есть сотни отдельных целей испытаний, поэтому потребуется несколько минут, чтобы запустить их все. При разработке, обычно лучше указать точные тесты, которые вас интересуют.
bazelisk test //: $path_to_test_file
См. Интеграции Bazel IDE.
После того, как компилятор будет построен, скомпилированная банка будет в каталоге bazel-bin/
. Вы можете получить доступ к нему с помощью звонка на java -jar ...
или с помощью скрипта Package.json:
# java -jar bazel-bin/compiler_uberjar_deploy.jar [...args]
yarn compile [...args]
src/com/google/javascript/jscomp/CommandLineRunner.java
или создать свою собственную расширенную версию класса.Однако вы решите внести свой вклад, пожалуйста, соблюдайте наш кодекс поведения, чтобы сохранить наше сообщество здоровым и гостеприимным местом.
Copyright 2009 Авторы закрытия.
Лицензировано по лицензии Apache, версия 2.0 («Лицензия»); Вы не можете использовать этот файл, кроме как в соответствии с лицензией. Вы можете получить копию лицензии по адресу http://www.apache.org/licenses/license-2.0.
Если это не требуется применимого законодательства или не согласовано в письменной форме, программное обеспечение, распространяемое по лицензии, распределяется по основам «как есть», без каких -либо гарантий или условий, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующих разрешения и ограничения по лицензии.
Кодовый путь | src/com/google/javascript/rhino , test/com/google/javascript/rhino |
URL | https://developer.mozilla.org/en-us/docs/mozilla/projects/rhino |
Версия | 1,5R3, с тяжелыми модификациями |
Лицензия | Netscape Public License и MPL / GPL Двойная лицензия |
Описание | Частичная копия Mozilla Rhino. Mozilla Rhino - это реализация JavaScript для JVM. Структуры данных дерева разбора JavaScript были извлечены и значительно изменены для использования компилятором Google JavaScript. |
Локальные модификации | Пакеты были переименованы. Весь код, не относящийся к дереву анализа, был удален. Были добавлены анализатор JSDOC и статическая система печати. |
URL | http://args4j.kohsuke.org/ |
Версия | 2.33 |
Лицензия | Грань |
Описание | Args4J - это небольшая библиотека классов Java, которая позволяет легко анализировать параметры командной строки/аргументы в вашем приложении CUI. |
Локальные модификации | Никто |
URL | https://github.com/google/guava |
Версия | 31.0.1 |
Лицензия | Apache License 2.0 |
Описание | Основные библиотеки Java от Google. |
Локальные модификации | Никто |
URL | https://github.com/findbugsproject/findbugs |
Версия | 3.0.1 |
Лицензия | Лицензия BSD |
Описание | Аннотации для обнаружения дефектов программного обеспечения. |
Локальные модификации | Никто |
URL | http://junit.org/junit4/ |
Версия | 4.13 |
Лицензия | Общая публичная лицензия 1.0 |
Описание | Структура для написания и запуска автоматизированных тестов в Java. |
Локальные модификации | Никто |
URL | https://github.com/google/protobuf |
Версия | 3.0.2 |
Лицензия | Новая лицензия BSD |
Описание | Поддержка библиотек для буферов протокола, кодирование структурированных данных. |
Локальные модификации | Никто |
URL | https://github.com/google/re2j |
Версия | 1.3 |
Лицензия | Новая лицензия BSD |
Описание | Линейное время регулярное выражение, сопоставленное на Java. |
Локальные модификации | Никто |
URL | https://github.com/google/truth |
Версия | 1.1 |
Лицензия | Apache License 2.0 |
Описание | Структура утверждения/предложений для Java Unit Tests |
Локальные модификации | Никто |
URL | https://ant.apache.org/bindownload.cgi |
Версия | 1.10.11 |
Лицензия | Apache License 2.0 |
Описание | ANT - это инструмент сборки на основе Java. Теоретически это похоже на «Make» без морщин Make и с полной переносимостью чистого кода Java. |
Локальные модификации | Никто |
URL | https://github.com/google/gson |
Версия | 2.9.1 |
Лицензия | Apache License 2.0 |
Описание | Библиотека Java для преобразования JSON в Java Objects и наоборот |
Локальные модификации | Никто |
Кодовый путь | contrib/nodejs |
URL | https://github.com/dcodeio/node.js-close-compiler-externs |
Версия | E891B4FBCF5F466CC4307B0FA842A7D8163A073A |
Лицензия | Apache 2.0 Лицензия |
Описание | Тип контрактов для API Nodejs |
Локальные модификации | Существенные изменения, чтобы сделать их совместимыми с NPMCommAndlinerunner. |