Вопрос

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

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

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

Также ищу любые дополнительные отзывы по этим товарам.Спасибо!

Это было полезно?

Решение

Я начну с того, что скажу, что я большой поклонник 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+ это больше не проблема, потому что вы используете новый "Режим разработки".По сути, это означает, что вы можете запускать код непосредственно в выбранном вами браузере, так что без потери скорости, плюс вы можете запускать firebug / проверять его и т.д.

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, довольно компактны.

Другие советы

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

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

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

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

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

Подводные камни, с которыми мы столкнулись:

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

  • Нет в вашей команде человека, знающего CSS.Исходя из моего опыта, не имело значения, что этот человек был недостаточно компетентен в работе и знает правильные термины для Google, когда это необходимо. expert...it достаточно того, что он обладает некоторыми практическими знаниями.

  • Отладка в разных браузерах.Следите за режимом размещения вне процесса[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.)

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

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

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

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

Обработка дат:

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

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

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

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

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

Прямо сейчас я работаю над проектом, который использует EXT GWT (GXT), не путать с GWT EXT.Есть разница, EXT GWT - это тот, который на самом деле производится компанией, написавшей библиотеку javascript ExtJS.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/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Особенно с выпуском UiBinder, позволяющего размещать виджеты GWT в формате XML, а затем кодировать их на Java.

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

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

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

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

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

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

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

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

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

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

Остающаяся боль:

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

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

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

Кроме того, если вы используете eclipse, добавьте следующее в разделе аргументы -> Аргументы виртуальной машины:

-Xmx512m -XX: Максимальный размер = 1024m -XX: постоянный размер = 1024m

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

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

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

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

Недавно я проделал большую работу над GWT, и вот что я должен сказать:

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

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

Желаю удачи в вашем решении :)

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

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

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

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

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

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

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

  1. addWidget(виджет) вызовет функцию removefromparent виджета()

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top