Google Closure Library. Краткий обзор инструментов с примерами их использования.
Евгений Борисов
четверг, 7 марта 2013 г.
В этой статье речь пойдёт о Google Closure Library (GCL) [1]. Это модульная,
кросс-браузерная библиотека программирования для разработки web-приложений на
JavaScript, с помощью которой построены популярные интернет сервисы Gmail, YouTube и др.
Она содержит структуры данных, средства для управления DOM и коммуникации
с сервером (AJAX), набор компонентов пользовательского интерфейса, элементов
управления и визуальных эффектов, а так же компоненты для отладки и модульного
тестирования. Примеры использования компонентов GCL можно посмотреть в [2],
отметим, что эти примеры для наглядности приводятся в не оптимизированном виде.
1. Hello World
Для начала скачаем файлы библиотеки.
Хотя в наборе инструментов имеется специальный оптимизирующий компилятор, о
котором мы расскажем в следующих разделах, библиотеку можно использовать и без
его применения, для этого в HTML необходимо указать ссылку на файлы библиотеки,
приведём простой пример.
Здесь мы не будем подробно рассматривать компоненты GCL, их описание
можно найти в [3],[4].
2. Применение Google Closure Compiler
Важной частью GCL есть Google Closure Compiler (GCC) [5] - оптимизирующий компилятор,
использующий специальные комментарии JSDoc [9] в тексте программы. GCC из исходного кода на
JavaScript генерирует оптимизированный код на JavaScript, во время работы он проверяет корректность
исходников, собирает код необходимых частей GCL и включает его в результирующий код. На выходе получаем
оптимизированный скрипт, которому для работы уже не требуются файлы GCL.
GCC написан на Java и для его (GCC) применения используются скрипты на языке Phyton, т.е. для работы
понадобиться JRE [6] и Phyton2 [7].
Качаем GCC:
Немного перепишем первый пример, выделим код JavaScript в отдельный файл:
Компилируем JavaScript:
в результате получаем скрипт start-compiled.js, который вставляем в HTML.
Отметим, что скрипту start-compiled.js для работы уже не требуются файлы GCL.
3. Шаблоны
GCL имеет свою систему шаблонов для генерации HTML. Для работы с шаблонами
нам понадобиться компилятор шаблонов Soy [8], который генерирует код JavaScript из
файлов-шаблонов.
Качаем Soy:
Пример шаблона с аннотациями JSDoc[9]:
Пример кода JavaScript, использующего soy-шаблон:
Генерируем JavaScript из шаблона hello.soy:
Компилируем JavaScript с шаблонами:
Вставляем скрипт в HTML.
4. Локализация и интернационализация
В этом разделе поговорим об адаптации к языковым и культурным особенностям
региона (регионов), отличного от того, в котором разрабатывался продукт [14].
К решению этой технической задачи есть два подхода - локализация и интернационализация.
Локализация (L10n) это "статическая" адаптация программы к данным языковым особенностям.
Она выполняется на этапе компиляции и жестко задаёт язык пользовательского интерфейса программы.
Интернационализация (i18n), в отличии от локализации, это "динамическая" (т.е. runtime)
адаптация программы. Система изначально проектируется так, что бы пользователь
в процессе работы с программой мог выбирать язык и форматы вывода информации.
В GCL есть два пакета для локализации и интернационализации
- goog.locale и goog.i18n [10, 11], при этом
goog.locale на настоящий момент помечен как устаревший (deprecated).
4.1 Локализация
При использовании метода статической локализации компилируется несколько
экземпляров скрипта для разных языков. Для работы системы выбирается один из них
в соответствии с текущими установками языка.
Для смены локализации приложения требуется перекомпиляция с другим словарём.
Словарь в формате XLLIF [12] генерируется специальной утилитой SoyMsgExtractor.
Скачаем её:
Для перевода словаря, сгенерированного SoyMsgExtractor, можно воспользоваться специальным инструментом
- Open Language Tools XLIFF Translation Editor [12].
Схема статической локализации с использованием шаблонов soy выглядит следующим образом.
создаём шаблон
Текстовые метки, требующие перевода в локализованных версиях приложения
(надписи на кнопках и др.), помещаем в специальные операторные скобки {msg descr="примечание для переводчика"} текст {/msg}.
все метки пишем на одном языке (русском).
Генерируем начальный словарь:
запускаем сборщик текстовых меток SoyMsgExtractor.
Он генерирует словарь messages_ru.xlf в формате XLLIF (в данном случае на русско-английский).
переводим messages_ru.xlf с помощью XLIFF Translation Editor [13].
генерируем код из template.soy с использованием файла локализации
Выбираем скомпилированный локализованный шаблон template_ru.soy.js и компилируем вместе с ним основной код.
На этапе компиляции задаём параметр goog.LOCALE.
Повторяем два предыдущих шага для всех необходимых языков.
4.2 Интернационализация
Теперь рассмотрим второй способ - смена языка в процессе выполнения (runtime).
В этом случае Soy, при генерации кода JavaScript из шаблона,
подставляет вызов функции goog.getMsg в местах вывода сообщений.
Для включения этого режима Soy используется флаг --shouldGenerateGoogMsgDefs.
Для переключения языка необходимо определить свои словари
и переопределить функцию goog.getMsg,
которая осуществляет замену набор сообщений по умолчанию
на локализованные сообщения, например так:
К сожалению тут есть затруднения, в режиме компилятора ADVANCED_OPTIMIZATIONS
переопределение goog.getMsg не срабатывает и упорно вызывается оригинальная версия
функции.
5. Компоненты для отладки
GCL содержит в себе специальные компоненты для тестирования и отладки приложений -
goog.testing и goog.debug [3], [10].
В этом разделе мы приведём несколько примеров их использования.
5.1 тесты
Пример использования тестов goog.testing.jsunit:
Это тест проверяет количество дочерних элементов у <div id="test"/>
5.2 вывод отладочной информации
Пример использования goog.debug.Logger.
Этот скрипт перехватывает сообщения мыши и сообщает об этом в соответствующей части окна.
В нижней части окна создаётся область, где отображаются сообщения отладчика.
5.3 Профилирование скрипта
Пример использования goog.debug.Trace.
В этом скрипте использован компоненент goog.debug.Trace, который показывает время
затраченое на исполнения фрагментов этого скрипта.