Про GWT

GWT — зло.

Вообще у меня есть подозрение, что все языки, компилируемые в JavaScript — это зло. Но у меня нет достаточного опыта работы с такими языками, как CoffeeScript и TypeScript, чтобы судить о них. По крайней мере выглядят они интересно. Кроме того, они, по сути, расширяют синтаксис JS, а не пытаются спрятать его от разработчика. Но всё-таки это компилируемые языки, а значит, неизбежны задержки при загрузке страницы и несоответствие набранного кода коду в браузере.

Но GWT — это особая песня.

«А давайте сделаем вид, что никакого JavaScript у нас нет! Мы типа пишем на Java типа гуй в стиле Свинга.»

Отсюда эмуляция половины стандартной библиотеки. Отсюда абсолютно раздутая собственная Java-библиотека, в которой сами разработчики путаются. Отсюда описание интерфейса в Java-коде, отсюда все эти заигрывания с ClientBundle, только усложняющие переиспользование и переопределение CSS, отсюда костыли вроде UiBinder. Опять-таки ненужные.

«А давайте сделаем декларативный язык разметки для интерфейса!»

Алё, гараж. В web-клиентах уже лет двадцать есть декларативный язык разметки интерфейса. HTML называется.

Велосипеды, велосипеды, сплошные велосипеды.

Не получается абстракция-с. JS прёт наружу. Закон текучих абстракций ещё никто не отменял. Сделать вид, что у нас JVM, всё равно не получится. Не работает рефлексия, многопоточность, I/O и ещё много чего, что никогда не будет поддерживаться в браузере. Стандартный API календаря и форматирования даты/времени тоже почему-то не поддерживается, вместо него свой костыль, да ещё и продублированный в двух пакетах.

И так у них всё.

При этом попытка скрестить ужа с ежом, то есть подогнать паттерны Java под паттерны JavaScript, смехотворна. В JS есть много кошерных вещей, невыразимых в Java. Прототипы, first class functions, apply/call/bind, eval и new Function (зло, но и у них есть свои области применения), динамическое переопределение объектов, интеграция с JSON и т.д. В GWT для каждой нестыковки лепят свой отдельный костыль. Вариантов прикручивания к GWT того же JSON существует как минимум штук пять, и у каждого свои косяки.

При этом GWT ещё и пытается изолировать программиста от уже устоявшихся клиент-серверных парадигм. REST? JSON-запросы? Не, не слышали. А берите-ка GWT-RPC, давайте делать вид, что мы гоняем по сети Java-объекты — естественно, с диким оверхедом на самопальную сериализацию. Естественно, серверная сторона становится ни с чем не совместимой, кроме GWT-клиентов. А попробуйте-ка написать для этой байды юнит-тесты и сравните с лёгкостью юнит-тестирования REST-ресурсов Restlet или JAX-RS.

В качестве попытки исправить косяки GWT-RPC эти клоуны написали RequestFactory. Который ещё хуже, ибо гвоздями прибивается к реализации на сервере. А ещё клиент привязывается к схеме базы данных, что уже вообще ни в какие ворота не лезет.

Кстати, о юнит-тестах. Одной из целей GWT заявляется как раз лёгкость юнит-тестирования. В итоге это выливается в то, что они предлагают выполнять автоматизированное тестирование GWT-клиентов… в браузере! Интересно, откуда возьмётся браузер на headless-сервере, где тесты гоняются автоматически в каком-нибудь jenkins’е. И чем это лучше тестирования JavaScript в браузере? Кстати, проблема с тестированием JavaScript решается вообще элементарно: Rhino + envjs для эмуляции браузера.

Что имеем в сухом остатке?

Тестирование на JavaScript:

  1. Внести изменения в код
  2. Перезагрузить страницу

Тестирование на GWT:

  1. Внести изменения в код
  2. Запустить тяжеленный сервер с devmode, еле ворочающийся с -Xmx512m
  3. Дождаться запуска
  4. Перезагрузить страницу
  5. Дождаться, пока тормозной компилятор распарсит ВЕСЬ клиентский Java-код, игнорируя слайсы и runAsync
  6. Выругаться на ошибки deferred binding, вылезающие в зависимости от погоды на Марсе
  7. Перезагрузить страницу
  8. Перезагрузить страницу
  9. Выругаться на OutOfMemoryError из-за текучего и тормозного браузерного плагина
  10. Перезапустить сервер, повторить шаги 2-5
  11. Наконец дождаться загрузки формы логина
  12. Залогиниться
  13. Подождать, пока компилятор подгрузит всё остальное…

Ну вы поняли.

А сначала-то какая у меня была эйфория, когда начальник решил использовать GWT. Шанс изучить новую технологию, да ещё и на Java! Это сейсас я понимаю, что на чистом JS я бы написала веб-морду гораздо быстрее и при этом меньше мучалась бы с багами разных сопутствующих библиотек в разных браузерах.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

*