Крупнейшие ловушки GWT?

Я нахожусь в начале/середине проекта, который мы решили реализовать с использованием GWT. Кто-нибудь сталкивался с серьезными проблемами в использовании GWT (и GWT-EXT), которые не могли быть преодолены? Как насчет перспективы работы?

Несколько вещей, которые мы уже видели/слышали, включают:

  • Google не может индексировать контент
  • CSS и стиль в целом кажутся немного шелушащимися

Ищите дополнительную информацию об этих товарах. Спасибо!

Ответ 1

Начну с того, что я большой фанат GWT, но да, есть много подводных камней, но большинство, если не все, мы смогли преодолеть:

Проблема: Длительное время компиляции, так как ваш проект растет, поэтому требуется время, необходимое для его компиляции. Я слышал сообщения о 20-минутных компиляциях, но мои в среднем около 1 минуты.

Решение: Разделите свой код на отдельные модули и сообщите ant только о его создании при его изменении. Кроме того, при разработке вы можете значительно ускорить время компиляции, создав только один браузер. Вы можете сделать это, поместив это в свой файл .gwt.xml:

<set-property name="user.agent" value="gecko1_8" />

Где gecko1_8 - Firefox 2+, ie6 - IE и т.д.


Проблема: Хост-режим очень медленный (по крайней мере на OS X) и не приближается к соответствию "живым" изменениям, которые вы получаете, когда редактируете такие вещи, как JSP или Rails, и обновляете обновления в вашем браузере.

Решение.. Вы можете предоставить размещенному режиму больше памяти (я обычно получил для 512 М), но он все еще медленный, я нашел, как только вы достаточно хорошо справитесь с GWT, вы прекратите использовать это. Вы делаете большой кусок изменений, затем компилируете только один браузер (как правило, скомпилируйте 20 секунд), а затем просто нажмите обновление в своем браузере.

Обновление: с GWT 2.0+ это уже не проблема, потому что вы используете новый "Режим разработки". Это в основном означает, что вы можете запускать код непосредственно в своем браузере по выбору, так что не теряйте скорость, плюс вы можете починить/проверить его и т.д.

http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM


Проблема: Код GWT - это java, и у него есть другой менталитет для выкладки HTML-страницы, что делает принятие HTML-дизайна и превращение его в сложный GWT

Решение: Снова вы привыкнете к этому, но, к сожалению, преобразование дизайна HTML в дизайн GWT всегда будет медленнее, чем делать что-то вроде преобразования HTML-дизайна на страницу JSP.


Проблема: GWT немного заводит вашу голову и еще не является основной. Это означает, что большинство разработчиков, которые присоединяются к вашей команде или поддерживают ваш код, должны будут изучить ее с нуля.

Решение: Остается увидеть, будет ли GWT взлетать, но если вы являетесь компанией, контролирующей, кого вы нанимаете, вы всегда можете выбрать людей, которые либо знают GWT, либо хотят узнайте его.


Проблема: GWT - кувалда по сравнению с чем-то вроде jquery или просто javascript. Для этого требуется гораздо больше настроек, чем просто файл JS.

Решение: Используйте библиотеки, такие как jquery, для небольших и простых задач, которые подходят для них. Используйте GWT, если вы хотите создать что-то действительно сложное в AJAX или где вам нужно передавать свои данные взад и вперед с помощью механизма RPC.


Проблема: Иногда, чтобы заполнить вашу страницу GWT, вам нужно сделать вызов сервера, когда страница загружается первой. Это может раздражать пользователя, чтобы он сидел и наблюдал за символом загрузки, пока вы извлекаете нужные данные.

Решение.. В случае страницы JSP ваша страница уже была обработана сервером до того, как он станет HTML, поэтому вы можете сделать все свои GWT-вызовы и предварительно загрузить их на страницы, для мгновенной загрузки. Подробнее см. Здесь:

Ускорить загрузку страницы путем предварительной сериализации вызовов GWT


У меня никогда не было проблем CSS стилизации моих виджетов, из коробки, обычай или иначе, поэтому я не знаю, что вы подразумеваете под тем, что это ловушка?

Что касается производительности, я всегда обнаружил, что когда скомпилированный GWT-код работает быстро, а вызовы AJAX почти всегда меньше, чем выполнение обновления всей страницы, но это не совсем уникально для GWT, хотя собственные RPC-пакеты, которые вы получаете если вы используете задний конец JAVA, довольно компактны.

Ответ 2

Мы работаем с gwt почти 2 года. Мы многому научились. Вот что мы думаем:

  • Не используйте сторонние библиотеки виджетов, особенно gwt-ext. Это убьет вашу производительность отладки, разработки и выполнения. Если у вас есть вопросы о том, как это происходит, свяжитесь со мной напрямую.

  • Используйте gwt для заполнения динамических частей ваших приложений. Поэтому, если у вас есть сложные пользовательские взаимодействия с большим количеством полей. Однако не используйте панели, которые поставляются вместе с ним. Возьмите на себя существующие страницы дизайнера. Выделите области, которые будут содержать элементы управления для вашего приложения. Прикрепите эти элементы управления к странице внутри onModuleLoad(). Таким образом, вы можете использовать стандартные страницы у своего дизайнера, а также делать все стили за пределами gwt.

  • Не создавайте все приложение как одну стандартную страницу, а затем динамически создавайте все части. Если вы сделаете то, что я предлагаю в пункте 2, это не произойдет в любом случае. Если вы будете строить все динамически, вы будете убивать производительность и потреблять огромные объемы памяти для приложений среднего и большого размера. Кроме того, если вы делаете то, что я предлагаю, кнопка "Назад" будет работать отлично, так что будет индексировать поисковые системы и т.д.

У других комментаторов также были хорошие предложения. Я использую правило для создания таких страниц, как вы делали стандартную веб-страницу. Затем вырезайте куски, которые должны быть динамичными. Замените их элементами с идентификатором, а затем используйте RootPanel.get( id ).add( widget ), чтобы заполнить эти области.

Ответ 3

Ловушки, с которыми мы столкнулись:

  • Хотя вы можете получить большой пробег от использования чего-то вроде GWT EXT, каждый раз, когда вы используете этот тонкий шпон поверх библиотеки JavaScript, вы теряете возможность отладки. Я не раз забивал себе голову на столе, потому что я не могу проверить (внутри моего отладчика IntelliJ), что происходит в классе таблицы GWT EXT... Все, что вы можете видеть, это то, что это JavaScriptObject. Это затрудняет определение того, что пошло не так...

  • У вас нет команды в команде, которая знает CSS. По моему опыту, не имело значения, что человек не был экспертом... достаточно, чтобы у него были хорошие рабочие знания и он знал правильные условия для Google, когда это было необходимо.

  • Отладка между браузерами. Следите за ходом бездействия [1] [2] [3], надеюсь, что в GWT 1.6... На данный момент вам просто нужно получить вещи хорошо с размещенным режимом, затем используйте кнопку "Скомпилировать/Обзор", где вы можете играть с другими браузерами. Для меня, работающих в Windows, это означает, что я могу просматривать свою работу в FireFox и использовать FireBug, чтобы помочь настроить и улучшить ситуацию.

  • IE6. Удивительно, как разные IE 6 будут делать вещи. Я применил подход к внешнему "окну просмотра" в соответствии с браузером, чтобы у меня были правила CSS:

    .my-style { /* stuff that works most everywhere */ }
    
    .msie6 .my-style { /* "override" so that styles work on IE 6 */ }
    

Наконец, убедитесь, что вы используете редактор, который вам поможет. Я использую IntelliJ - у него много умений GWT. Например, если я пытаюсь использовать класс, который не обрабатывается эмуляцией JRE, это позволяет мне знать; если я укажу стиль для виджета, и я еще не определил этот стиль, код становится немного красноватым... Или, глядя на CSS, он скажет мне, когда я указал конфликтующие атрибуты в одно правило. (Я еще не пробовал, но я понимаю, что версия 8 имеет еще лучшую поддержку GWT, например, синхронизация "локальных" и "асинхронных" RPC-интерфейсов и реализаций.)

Ответ 4

GWT 2.0, который должен появиться через несколько месяцев, решает много обсуждаемых вопросов.

  • Создание макетов с использованием синтаксиса html/xml
  • Динамический Script Загрузка - сначала будет загружен только основной JS. Остальные будут загружаться по мере необходимости
  • Входящий в браузере режим - это может позаботиться об обсуждаемых проблемах с частотами режима размещения, среди прочих преимуществ.
  • "Оптимизация компилятора" - более быстрая компиляция, надеюсь.

GWT 2.0 Предварительный просмотр видео в Google I/O

Ответ 5

Не "невозможно преодолеть", а немного боли для чего-то основного.

Обработка данных:

GWT использует устаревший java.util.Date, который может привести к неожиданному поведению при работе с датами на стороне клиента. java.util.Calendar не поддерживается GWT. Дополнительная информация здесь.

Примеры связанных проблем:

Ответ 6

Я добавлю некоторые моменты к уже упомянутым:

  • Databinding/проверки. GWT не поддерживает поддержку привязки/валидации, хотя некоторые проекты в этой области начинают появляться. Вы обнаружите, что пишете много:
TextField fname, faddress;
...
fname.setText(person.getName());
faddress.setText(person.getAddress());
...
  • Ленивая загрузка. Поскольку gwt находится на стороне клиента, ленивая загрузка действительно не вариант. Вы должны тщательно проектировать свои RPC и объекты домена, чтобы
    • отправить все необходимые данные объекта
    • избегать получения всех ваших данных.
    • Вам также нужно будет убедиться, что вы не будете отправлять прокси/несериализуемые объекты. hibernate4gwt может помочь вам в этих точках.
  • Дизайн пользовательского интерфейса. Труднее визуализировать пользовательский интерфейс в java (панели, кнопки и т.д.), Чем в html.
  • Поддержка истории. GWT не поставляется с подсистемой "История" и не поставляется с какой-либо подсистемой для хороших URL-адресов или закладок в целом. Вам придется сворачивать самостоятельно (хотя у него есть поддержка токенов истории, что является началом). Это происходит со всеми инструментами AJAX AFAIK.

IMHO, GWT отсутствует фреймворк, который имеет встроенную поддержку всех проблем, упомянутых в этом "потоке".

Ответ 7

Сейчас я работаю над проектом, который использует EXT GWT (GXT), чтобы не путать с GWT EXT. Существует различие: EXT GWT - это тот, который фактически создан компанией, которая написала ExtJS в библиотеке javascript. GWT EXT - это оболочка GWT вокруг библиотеки ExtJS. GXT - это собственный GWT.

В любом случае, GXT по-прежнему несколько незрелый и испытывает недостаток в солидном сообществе, которое я ощущаю GWT EXT. Тем не менее, будущее с GXT, как его родной GWT и фактически разработан компанией, которая сделала ExtJS. GWT EXT несколько искалечен, поскольку лицензия изменилась в библиотеке ExtJS, что замедляет разработку GWT EXT.

В целом, я думаю, что GWT/GXT является хорошим решением для разработки веб-приложения. Мне действительно нравится режим размещения для разработки, это делает вещи быстрыми и легкими. Вы также получаете возможность отлаживать свой код. Групповые тесты с JUnit довольно прочные. Я еще не видел отличную платформу тестирования модулей JavaScript, которая, по моему мнению, достаточно зрелая для тестирования корпоративного приложения.

Для получения дополнительной информации о GWT EXT: http://gwt-ext.com/

Для получения дополнительной информации о EXT GWT (GXT): http://extjs.com/products/gxt/

Ответ 8

Никаких серьезных подводных камней, которые я не смог легко преодолеть. Используйте режим размещения в значительной степени. Поскольку вы используете GWT-ext, вам почти никогда не придется прикасаться к CSS самостоятельно, если вы не захотите настроить внешний вид окна.

Моя рекомендация - использовать "собственный" виджет GWT над библиотекой, где они близки по функциям.

Повторите индексирование поисковой системы: да, сайт не будет иметь навигационных URL-адресов в обычном режиме (если только вы не добавляете виджеты в элементы обычного веб-сайта). Тем не менее, вы можете использовать функцию возврата назад/вперед.

Ответ 9

Я использовал GWT и GWT-ext вместе в проекте некоторое время назад. Я нашел этот опыт довольно гладким, как веб-разработки, но мой совет будет следующим:

Не смешивайте собственные виджеты GWT с виджетами EXT. Это сбивает с толку, так как обычно имена одинаковы (GWT.Button или GWText.Button?)

Одна вещь, которая произошла со мной, которая действительно сделала код более сложным, чем хотелось бы, заключалась в том, что мне нужна группа, которая была а) динамически обновляемый б) каскадируемый

Собственные панели GWT являются динамическими, панели Ext являются каскадируемыми. Решение? GWT.VerticalPanel, обертывающий панель GWTExt... Chaos.:)

Но эй, это работает.;)

Ответ 10

Второй комментарий от ykagano, самый большой недостаток - потерять V в MVC. Хотя вы можете отделить истинный ui-класс от остальной части вашего клиентского кода, вы не можете легко использовать HTML-страницу, созданную графическим/веб-дизайнером. Это означает, что разработчику необходимо перевести HTML в java.

Получить редактор wysiwyg ui, это сэкономит вам много времени. Я использую GWTDesigner.

Самый большой потенциал GWT - это возможность забыть о проблемах с кросс-браузером. Это не 100%, но отнимает почти всю эту боль. В сочетании с возможностью отладки в режиме хостинга (в отличие от Firebug, который отличен, но не такой, как отладчик java), он дает разработчику огромное преимущество в создании сложных приложений ajax.

Oh и его быстро во время выполнения, особенно если вы используете gzip-фильтр.

Ответ 11

Немного не по теме, но канал #gwt на irc очень полезен, в случае, если у вас есть постоянная проблема.

Ответ 12

GWT довольно прямолинейный и интуитивно понятный.

Специально с выпуском UIBinder, чтобы позволить виджетам GWT быть выложены в XML, а затем закодированы в Java.

Итак, если вы использовали другие инструменты разработки Ajax или Flash, или Silverlight и т.д., GWT очень легко изучить.

Основным препятствием, если не ошибкой, является GWT RPC. Сама причина, по которой вы хотите использовать GWT, связана с GWT async RPC. В противном случае, почему бы не просто полагаться на css для форматирования вашей страницы?

GWT RPC - это тот элемент, который позволяет вашему серверу обновлять данные на вашем сервере, не обновляя страницу. Это абсолютное требование для таких страниц, как мониторинг эффективности акций (или текущий национальный и государственный долг США или число нерожденных детей, прерванных во всем мире вторым).

GWT RPC предпринимает определенные усилия, чтобы понять, но, учитывая несколько часов, все должно быть ясно.

Помимо этого, после того, как вы попытаетесь изучить GWT RPC, вы, наконец, обнаружите, что не можете использовать JSP в качестве компонента службы для RPC, если... У меня есть 8-я часть (я думаю) в моем блоге о том, как использовать JSP в качестве сервис-провайдера GWT RPC. Однако, поскольку вы не просили ответов, а просто дела, я откажусь от рекламы своего блога.

Итак. Я очень верю, что худшие препятствия на пути использования GWT - это выяснить, как правильно развернуть GWT async RPC и как включить его для использования JSP-сервисов.

Ответ 13

Нам очень трудно жениться на нашей кодовой базе GWT с веб-шаблонами HTML, которые мы получили от веб-дизайнера (статические HTML-страницы с определенными идентификаторами div, которые мы хотели, чтобы GWT управлял). По крайней мере, когда мы его использовали, мы не смогли заставить GWT интегрироваться с частями нашего сайта, которые не были закодированы в GWT. Мы в конечном итоге работали, но это был большой взлом.

Ответ 14

  • Интерфейс Async, который вы должны написать для каждого интерфейса службы, выглядит как нечто, которое может быть автоматически сгенерировано компилятором GWT.
  • Время компиляции становится длинным для крупных проектов

Но для большого проекта Javascript это лучший выбор

Ответ 15

GWT 2.4 устранил многие из вышеупомянутых проблем, и отличная библиотека виджета просто выходит из бета-версии (Ext GWT 3.0.4 aka GXT), которая полностью написана в GWT, а не в оболочке JS lib.

Оставшаяся боль:

  • Отсутствие поддержки селектора CSS3, вы можете использовать "literal()" в некоторых случаях, чтобы обойти его.
  • Отсутствие поддержки CSS3 и современных событий браузера, таких как transitionEnd.
  • Отсутствие поддержки класса Java Calendar (много лет спустя).
  • Отсутствие поддержки JUnit4 (5 лет и подсчет).
  • Отсутствие четкой дорожной карты и графика выпуска из команды Google GWT.

Ответ 16

Что касается GWT 2.4, Использовать Firefox при отладке GWT, это намного быстрее, чем использование хром. И если вы будете использовать только firefox, рассмотрите возможность размещения этой строки в файле project.gwt.xml

<set-property name="user.agent" value="gecko1_8" />

Кроме того, если вы используете eclipse, добавьте следующие аргументы → аргументы VM:

-Xmx512m -XX: MaxPermSize = 1024 м -XX: PermSize = 1024 м

Вы можете разделить сервер и клиент и использовать следующие аргументы → Аргументы программы: -codeServerPort 9997 -startupUrl http://yourserver/project -noserver

Кроме того, чтобы предотвратить обновление сервера при каждом изменении, используйте JRebel http://zeroturnaround.com/blog/how-to-rock-out-with-jrebel-and-google-web-toolkit-gwt/ И вот живая демонстрация http://www.youtube.com/watch?feature=player_embedded&v=4JGGFCzspaY

Ответ 17

Одна из основных ошибок заключается в том, что иногда вам нужно явно назначать идентификатор тому, что в конечном итоге становится элементом HTML, чтобы иметь возможность использовать определенные стили CSS. Например: вкладка GWT TabPanel будет выполнять только: наведите указатель мыши на tabBarItems, когда tabBar вкладки tabPanel был назначен идентификатор, и вы указали: наведите указатель на этот элемент.

Я писал о некоторых других недостатках GWT в другом месте, но они уже покрыты ответом rustyshelfs:).

Ответ 18

Недавно я много работал над GWT, и я должен сказать:

  • CSS-стиль сложнее только иногда, используйте инструмент IE-разработчика в IE и firebug в Firefox, чтобы выяснить, что именно происходит, и вы получите четкое представление о том, что нужно изменить css.
  • Вы можете использовать трюки, чтобы заставить Google индексировать его. Очень известный сайт http://examples.roughian.com/ проверить свои рейтинги в google. Значительно менее известный сайт www.salvin.in (не мог удержаться, чтобы упомянуть об этом), я оптимизировал его словами: Главная страница Salvin (поиск google для эти три слова)

Я не знаю много о GWT-EXT, но я тоже полагаю, что нет необходимости включать сторонние библиотеки.

Удачи вам в решении:)

Ответ 19

GWT использует Browser Sniffing вместо функции Detection, и ваше приложение не будет работать на некоторых браузерах (особенно новых)

Вот несколько ссылок на проблему:

Вот некоторые ссылки на функцию обнаружения:

Извлечено из Сравнение фреймворков JavaScript - Википедия

Ответ 20

Повторное использование объектов службы RPC.
Это приводит к условиям гонки с симптомами, которые выглядят как приложение, висящее.

Ответ 21

Ловушки, с которыми я столкнулся 1. Различное поведение в режиме супердева. Например. Someclass.class.getName() отлично работает в режиме Superdev и возвращает полное имя класса. В продуктивном режиме это не работает.

  1. addWidget (виджет) вызовет виджет removefromparent()

Ответ 22

Команда GWT значительно улучшилась в прошлом году, выпустив GWT 2.7. Одной из основных недостатков GWT было то, что компиляция занимает много времени в GWT 2.6 и ниже. В настоящее время GWT не имеет инкрементной компиляции, которая является супер быстрой и компилирует только изменения.

Теперь GWT 2.7 имеет (Источник):

  • Инкрементальные сборки теперь всего лишь секунды
  • Более компактные, более точные SourceMaps
  • Поддержка GSS
  • JSInterop
  • Отличная производительность JavaScript
  • Меньший размер кода

Ответ 23

Лучший способ получить достоверные факты из gwt survey. Одной из самых больших проблем с GWT всегда было длительное время компиляции. К счастью, он очень быстро улучшается, поэтому в ближайшем будущем это не будет серьезной проблемой. Другая ошибка заключается в том, что GWT значительно сложнее, потому что Java - это более сложный язык, который сопротивляется плохим кодовым устройствам на каждом шагу. Кроме того, компиляция добавляет слой. Например, js interop требует небольшого шаблона. Основная проблема заключается в том, что GWT не был прост. Он был разработан с нуля для чрезвычайно сложных веб-приложений, и все сообщество постоянно уделяет первоочередное внимание, производительность, качество кода, архитектуру и т.д. По сравнению с простым кодированием.
   Помните, что вы можете использовать js в GWT в любой точке, поэтому, если вы боретесь с GWT, подумайте об использовании js. В конце дня GWT - это js, поэтому вы можете делать что-нибудь в GWT, что вы можете в js. Фактически, большинство проектов GWT используют js. Проблема в том, что GWT значительно сложнее. Тем не менее, это иногда стоит дополнительной сложности.

Стоит отметить, что GWT 3.0 принесет значительные улучшения.

Ответ 24

GWT - шедевр технологии. Он объединяет клиентское и серверное программирование, делая его одним последовательным приложением - способом, которым было написано программное обеспечение перед "расслоением", и тем, как оно должно быть написано. Он устраняет различные наборы навыков, неверную связь между членами команды и, как правило, весь этап веб-дизайна: как художественный, так и программирующий. И это ближе всего к мобильному, например. Разработка Android. На самом деле GWT был разработан для создания разных пользовательских интерфейсов, а не только для HTML. Хотя это требует огромной дисциплины, чтобы обеспечить такую ​​развязку - сохранить внутреннее представление слоев - агностик.

Первую ошибку, которую следует избегать, которая потребовалась мне четыре года, заключается в использовании сторонних расширений, таких как EXT-GWT aka GXT и SmartGWT. Очень заманчиво начать использовать свои симпатичные виджеты для рабочего стола вместо того, чтобы вкладывать средства в свой собственный стиль, но я не могу сказать, сколько проблем у меня было с SmartGWT, пока я, наконец, не устал. Короче говоря, он замораживает основную функцию GWT, установленную на определенном (довольно устаревшем) уровне, а затем строит поверх нее. Также имейте в виду, что выдержанный настольный внешний вид выглядит глупо в наши дни, не говоря уже о вялой производительности, множестве ошибок и совместимости, особенно на мобильных устройствах. Вы хотите оставаться как можно ближе к собственным элементам управления браузером, насколько это возможно, то есть выпадающие меню, отображаемые как native <select> элементы, а не некоторые элементы управления, окрашенные вручную.

Благодаря мобильным тенденциям весь UX становится все более простым и более плоским, поэтому вам не нужно много делать, чтобы создать острое приложение. Хотя, если вам нужен "3D" вид, есть также градиенты. CSS3 сделал все легко, и GWT обертывает его элегантным объектно-ориентированным способом, в отличие от необработанного CSS. Поэтому не обескураживайте, глядя на довольно уродливые элементы управления barebones в GWT Showcase. Команда GWT намеренно не предлагала никакого стиля, потому что это работа разработчика.

Остальное - довольно обычное программирование браузера в строго типизированной Java с красивыми краткими API-интерфейсами. Но, конечно, никогда не забывайте, что ваш код работает внутри браузера, поэтому все вызовы асинхронны, например. вы не можете вызывать методы GWT-RPC в цикле (для заполнения некоторого списка), но вам нужно рекурсивно связывать их, если вы когда-нибудь приходите в эту ситуацию.

Есть некоторые самопровозглашенные "анти-шаблоны", которые не используют GWT-RPC. Это было хорошо для меня до сих пор: 10 лет. Простота - ключ. Я бы не подумал, что даже секунда, чтобы пожертвовать некоторыми маргинальными характеристиками для элегантности кода и ремонтопригодности. кроме того, это не то место, где ваши узкие места будут - в базе данных. Разумеется, помните, сколько данных вы отправляете клиенту.

И если вы не можете найти или создать существующий набор гаджета - прочитанный богатый набор HTML5, вы всегда можете обернуть сторонний. Я сделал это с помощью популярного jQuery FullCalendar. Не ракетостроение вообще. Все остальное, как Google Maps и Google Charts, имеет полуофициальные обертки GWT.

GWT отлично. Единственная причина, по которой он не получает достаточной любви, - это то, что ранние интернет-пользователи, которые все еще влияют на отрасль, не пришли из Computer Science и объектно-ориентированных языков, чтобы их оценить. У них есть либо художественный (Photoshop/WordPress), либо сетевой (Perl/Python) фон.