Набор инструментов GWT: создавайте мощные внешние интерфейсы JavaScript с помощью Java
Опубликовано: 2022-03-11GWT Web Toolkit, ранее известный как Google Web Toolkit, представляет собой набор инструментов разработки для создания и оптимизации сложных браузерных приложений с использованием языка программирования Java.
Что делает GWT не «еще одним инструментом Java для написания веб-приложений», так это тот факт, что сердцем набора инструментов является компилятор, который преобразует Java в JavaScript (а также HTML и CSS), позволяя разработчикам писать интерфейсные веб-приложения. используя все сильные стороны Java.
Можно даже легко использовать сочетание Java и JavaScript, поскольку GWT включает в себя надежную архитектуру взаимодействия для взаимодействия с веб-платформой. Подобно тому, как Java Native Interface (JNI) позволяет виртуальной машине Java (JVM) вызывать специфичные для платформы подпрограммы (например, для доступа к определенным аппаратным функциям или использования внешних библиотек из других языков), GWT позволяет нам писать большую часть приложение на Java, а затем, при необходимости, использовать определенный веб-API или использовать существующие библиотеки JavaScript, чтобы «перейти на родное» и перейти к JavaScript.
GWT родился как продукт Google, но в конце 2011 года стал открытым исходным кодом и в настоящее время выпускается под лицензией Apache (версия 2) под названием GWT Open Source Project . Им управляет руководящий комитет, в который входят представители нескольких компаний, включая Google, RedHat, ArcBees, Vaadin и Sencha, а также независимые разработчики из сообщества.
GWT в прошлом и будущем
Google Web Toolkit был впервые выпущен в 2006 году. Он был создан как инструмент, помогающий инженерам Google разрабатывать сложные браузерные приложения, такие как AdWords, Google Wallet и Google Flights. Приложения Google Sheets и Inbox.
В 2006 году браузеры (и интерпретаторы JavaScript) были далеки от стандартизации. Интерфейсный код был медленным, содержал ошибки и его было трудно надежно использовать. Почти полное отсутствие качественных библиотек и фреймворков для веб-разработки. Например, до этого года jQuery даже не существовало. Итак, чтобы иметь возможность разрабатывать крупномасштабные веб-приложения, инженеры Google решили использовать существующие инструменты и компетенции. Java был наиболее подходящим языком для их нужд, будучи хорошо известным и прекрасно интегрированным в IDE, такие как Eclipse, и так начал свою жизнь Google Web Toolkit.
Цель состояла в том, чтобы более или менее скрыть различия между браузерами и инкапсулировать приемы, необходимые для написания эффективного JavaScript внутри компилятора Java, освобождая разработчиков от тирании технических аспектов браузера.
Конечно, за последнее десятилетие Интернет изменился; браузеры стали быстрее и приблизились к стандартам реализации, и было разработано множество замечательных интерфейсных фреймворков и библиотек, включая jQuery, Angular, Polymer и React. Итак, первый вопрос, который вы, естественно, можете задать: «Полезен ли GWT?»
Одним словом: Да .
В контексте современной веб-разработки неизбежна ориентация на браузеры, и JavaScript стал лингва-франка интерфейсных приложений. Но, конечно, разные инструменты и языки лучше подходят для разных задач. GWT, наряду с несколькими подобными проектами, нацелен на браузеры, не ограничивая разработчиков использованием JavaScript.
Разработку и использование инструментов «компиляции в сеть», таких как GWT, в ближайшем будущем будет способствовать так называемая группа WebAssembly Консорциума World Wide Web. Существует не только огромное пространство для инструментов, которые компилируются в JavaScript, но этот подход может удовлетворить реальную потребность в контекстах, которые варьируются от переноса части вычислений на браузеры, повторного использования существующего кода и библиотек, совместного использования кода между внутренним и внешним интерфейсом. , используя существующие компетенции и рабочие процессы, а также используя возможности разных языков (например, статическую типизацию в случае GWT).
Ожидается, что проект GWT скоро выпустит версию 2.8, а версия 3.0 находится в разработке с большими улучшениями:
- заново изобретенная совместимость с JavaScript
- улучшенный (почти полностью переписанный) компилятор
- современная поддержка Java (например, лямбда-выражения)
На самом деле, большинство функций GWT 3.0 уже доступны в общедоступном репозитории Git. Просто проверьте ствол здесь и скомпилируйте GWT, следуя документации здесь.
Сообщество GWT
С тех пор как GWT стал открытым исходным кодом в 2011 году, сообщество взяло на себя ключевую роль в развитии проекта.
Вся разработка происходит в репозитории Git, размещенном на gwt.googlesource.com, а все проверки кода выполняются на gwt-review.googlesource.com. На этих страницах любой, кто заинтересован в разработке инструментария, может внести свой вклад и посмотреть, над чем работает сообщество. За последние несколько лет процент новых исправлений от не-гуглеров вырос примерно с 5% в 2012 году до примерно 25% в прошлом году, что подтверждает растущее участие.
В этом году сообщество собралось на несколько крупных встреч в США и Европе. GWT.create, организованный Vaadin, прошел в январе в Мюнхене, Германия, и в Маунтин-Вью, Калифорния, и насчитывал более 600 участников из десятков стран. 11 ноября во Флоренции, Италия, мы проведем второе издание GWTcon, конференции GWT, организованной сообществом, которую я помогаю организовать.
Для чего подходит GWT?
В ежегодном обзоре инструментария GWT, выпускаемом Vaadin, обсуждается эволюция разработки GWT, что разработчики думают о наборе инструментов, что хорошо, что плохо и так далее. Этот опрос также позволяет нам понять, для чего используется набор инструментов, как меняется сообщество пользователей и какие ожидания разработчики связывают с набором инструментов в будущем.
Отчет о будущем GWT за 2015 год можно найти здесь, и из него становится ясно, что GWT очень популярен для создания крупномасштабных веб-приложений. Например, на странице 14 говорится: «Большинство приложений — это бизнес-приложения, которые содержат большие объемы данных и работают с ними по много часов в день».
Как и следовало ожидать, легко сделать вывод, что естественной средой для GWT является область крупномасштабных веб-приложений, где важна ремонтопригодность кода, а большие команды выигрывают от структуры языка Java.
С другой стороны, глядя на тесты для кода, сгенерированного GWT (например, в программном докладе прошлогодней конференции GWT.create, на страницах 7, 8 и 11), легко увидеть, что с точки зрения производительности и размер кода, скомпилированный JavaScript потрясающе хорош. При правильном использовании полученная производительность сравнима с лучшим написанным вручную JavaScript. В результате действительно возможно использовать GWT для переноса библиотек Java в Интернет.
Это освещает еще один идеальный сценарий для GWT. Экосистема Java полна высококачественных библиотек, у которых нет готовых аналогов в JavaScript. Компилятор GWT можно использовать для адаптации таких библиотек для Интернета. Другими словами, GWT позволяет нам смешивать библиотеки, доступные как в Java, так и в JavaScript, и запускать их в браузере.
Этот подход можно увидеть при разработке PicShare, где мы показываем, как несколько библиотек Java, обычно не предназначенных для Интернета (например, NyARToolkit), можно портировать в браузер с помощью GWT и комбинировать с веб-API, включая WebRTC и WebGL, для получить полностью веб-инструмент дополненной реальности. Я был горд представить PicShare на конференции GWT.create 2015 года в январе прошлого года.
Под капотом: Превращение Java в JavaScript
GWT Toolkit представляет собой умеренно сложный набор инструментов, но любой может начать использовать его в один миг благодаря удивительно простой в использовании интеграции с Eclipse.
Создать простое приложение с помощью GWT относительно легко для любого, кто имеет опыт работы с проектами разработки Java. Но чтобы понять, что «происходит на самом деле», стоит проанализировать основные компоненты инструментария:
- Транспилятор Java в JavaScript
- Эмулированная среда выполнения Java
- Уровень взаимодействия
Оптимизирующий компилятор GWT
Подробное описание того, как работает компилятор, довольно рано становится узкотехническим, и нам не нужно копать так глубоко, но на некоторые общие концепции стоит обратить внимание.
Первое, что нужно понять, это то, что GWT компилирует Java в JavaScript путем трансляции на уровне исходного кода. То есть исходный код Java переводится ( транспилируется — это технический термин) в JavaScript. Это отличается от наличия какой-то виртуальной машины Java, написанной на JavaScript, которая выполняет байт-код Java. (На самом деле это возможно, и это подход, используемый Doppio, но это не то, как работает GWT.)

Вместо этого код Java разбивается на абстрактное синтаксическое дерево (AST), представляющее синтаксические элементы кода. Затем он сопоставляется с эквивалентным (и оптимизированным) Javascript AST, который, наконец, преобразуется обратно в реальный код JavaScript.
Взвешивание плюсов и минусов транспиляции далеко от цели этого поста, но позвольте мне заметить, что с помощью этого метода GWT может напрямую использовать службы сборки мусора интерпретатора JavaScript, наряду с любыми другими функциями, присущими браузеру.
Есть сложные моменты, конечно. Например, в JavaScript есть только один числовой тип, который не может содержать 64-битный long
целочисленный тип Java, поэтому long
типы требуют специальной обработки компилятором. Кроме того, статическая типизация Java не имеет прямого значения в JavaScript, поэтому необходимо соблюдать особую осторожность, чтобы, например, операции приведения типов после транспиляции оставались эквивалентными.
С другой стороны, очевидным преимуществом транспиляции является то, что GWT может выполнять оптимизацию (как по размеру, так и по производительности) на уровне Java и на уровне JavaScript. Полученный стандартный код JavaScript можно даже дополнительно обработать в конвейере развертывания. Например, обычная практика, которая теперь интегрирована в стандартный дистрибутив GWT, включает в себя оптимизацию вывода JavaScript транспилятором с использованием узкоспециализированного компилятора JavaScript-to-JavaScript Closure Compiler (еще один подарок от богов Google).
Наиболее подробное описание компилятора GWT, которое я знаю, можно найти в этом наборе слайдов и в исходном докладе, из которого он взят. Здесь вы можете найти подробности о других интересных функциях процесса компиляции, таких как способность GWT выполнять разделение кода, генерируя несколько отдельных файлов сценариев для независимой загрузки браузером.
Эмулируемая JRE
Компилятор Java-to-JavaScript был бы не более чем новинкой, если бы не был дополнен реализацией Java Runtime Environment (JRE), которая предоставляет основные библиотеки, на которые опирается почти любое приложение Java. Грубо говоря, работать на Java без, например, методов Collections или String было бы неприятно, и, конечно, портирование этих библиотек — титанический труд. GWT заполняет эту брешь с помощью так называемой эмулируемой JRE.
Эмулированная JRE ни в коем случае не является полной повторной реализацией Java JRE, а скорее является своего рода набором классов и методов, которые могут быть полезны (и пригодны для использования) на стороне клиента. Функциональные возможности, которые есть в Java JRE, но которые вы не найдете в эмуляции JRE, делятся на три категории:
Вещи, которые нельзя портировать на стороне клиента. Например,
java.lang.Thread
илиjava.io.File
не могут быть реализованы в браузере с той же семантикой Java. Страница браузера является однопоточной и не имеет прямого доступа к файловой системе.Вещи, которые можно было бы реализовать, но которые «стоили бы слишком дорого» с точки зрения размера кода, производительности или зависимостей, и поэтому сообщество предпочитает не иметь их внутри GWT. В эту категорию, например, входит отражение Java (
java.lang.reflect
), которое требует, чтобы транспилер сохранял информацию о классе для каждого типа, и это привело бы к увеличению размера скомпилированного JavaScript.Вещи, которые никого не интересовали и поэтому не были реализованы.
Если случается так, что Эмулированная JRE не соответствует вашим потребностям (например, вам нужен некоторый класс, который не предоставляется), GWT позволяет вам написать свою собственную реализацию. Этот мощный механизм, доступный через тег <super-source>
, позволяет обойти проблемы при адаптации новых внешних библиотек, использующих неэмулируемые части JRE.
Полная реализация некоторых частей JRE может быть слишком сложной или даже невозможной, поэтому для конкретных задач ваши собственные реализации могут не строго следовать семантике Java JRE, даже если они работают в вашем конкретном случае. Действительно, если вы планируете вернуть свои классы в проект, помните, что для эмуляции JRE крайне важно, чтобы каждый включенный класс следовал той же самой семантике исходной Java JRE. Это гарантирует, что любой может перекомпилировать код Java в JavaScript и быть уверенным, что получит ожидаемые результаты. Всегда убедитесь, что ваш код тщательно протестирован, прежде чем возвращать его сообществу.
Уровень взаимодействия
Чтобы быть эффективным инструментом для создания реальных веб-приложений, GWT должен позволять разработчикам легко взаимодействовать с базовой платформой. То есть браузер и DOM.
С самого начала GWT был создан для поддержки такого взаимодействия через собственный интерфейс JavaScript (JSNI), что упрощает доступ к API-интерфейсам в браузере. Например, используя особенности синтаксиса, уникальные для компилятора GWT, вы можете написать следующий код Java:
public static native void nativeMethod(T1 a1, T2 a2, ...) /*-{ //place your JavaScript code here }-*/;
и вы можете реализовать тело метода в JavaScript. Вы даже можете обернуть объекты JavaScript в JavaScriptObject (JSO) и сделать их доступными в коде Java.
Пример того, как этот слой вступает в игру, можно найти в контексте композиции пользовательского интерфейса. Основной поток Java всегда использовал стандартный набор инструментов Widgets для создания элементов пользовательского интерфейса, используя собственный интерфейс Java для доступа к системам окон и ввода базовой операционной системы. Уровень взаимодействия GWT делает то же самое, так что традиционные виджеты без проблем работают в браузере. Единственное отличие состоит в том, что в данном случае базовой системой является браузер и DOM.
Однако за последние годы собственные интерфейсные фреймворки быстро улучшились и в настоящее время предлагают значительные преимущества по сравнению с виджетами GWT. По мере усложнения этих сред попытки реализовать их в JSNI выявили недостатки в архитектуре уровня взаимодействия. Начиная с версии 2.7 GWT представил JsInterop, новый подход, основанный на аннотациях Java, который позволяет быстро и легко интегрировать классы GWT с JavaScript. Больше нет необходимости писать методы JSNI или классы JSO. Вместо этого вы можете просто использовать аннотации, такие как @JSType
или @JSProperty
, что позволит вам работать с собственными классами JavaScript, как если бы они были Java.
Полная спецификация JsInterop все еще находится в разработке, и последние обновления можно опробовать, только скомпилировав исходный код из репозитория GWT. Но уже сейчас ясно, что это новое направление, которое позволит GWT идти в ногу с развивающимися веб-платформами.
Одним из текущих проектов, использующих преимущества JsInterop, является недавно выпущенный gwt-polymer-elements, который делает все элементы Iron и Paper из Polymer доступными для GWT. Что интересно в этой библиотеке, так это то, что разработчикам не нужно генерировать Java API вручную. В проекте используется gwt-api-generator для создания большинства интерфейсов напрямую путем анализа библиотеки Polymer и аннотаций JSDoc. Это позволяет легко поддерживать привязки в актуальном состоянии.
Заключительные слова
Благодаря улучшениям компилятора, уровня взаимодействия, а также производительности и размеру сгенерированного кода за последние два года становится ясно, что GWT — это не просто «еще один инструмент веб-разработки», но он находится на пути к тому, чтобы стать основным справочным набором инструментов для для разработки крупномасштабных сложных веб-приложений, и даже может быть отличным выбором для создания потрясающих простых приложений.
Я ежедневно использую GWT в своей работе в качестве разработчика и консультанта, но больше всего я люблю GWT, потому что он позволяет мне раздвинуть границы возможностей браузера и показать, что современные веб-приложения могут быть такими же мощными, как настольные приложения.
Сообщество проекта GWT очень активно, и постоянно предлагаются новые библиотеки, проекты и приложения, основанные на GWT. 11 ноября во Флоренции состоится организованный сообществом GWTcon2015. Если вы находитесь в этом регионе, я надеюсь, что вы приедете и встретитесь с некоторыми из основных разработчиков и узнаете обо всех возможностях стать частью эволюции этого удивительного инструментария.