Почему GWT?Преимущества и недостатки использования этой структуры RIA - PullRequest
36 голосов
/ 20 января 2010

Я читал кучу вопросов с наибольшим количеством голосов для GWT. Некоторые из этих вопросов говорят о подводных камнях или проблемах с GWT.

В статьях: Какая структура Javascript (jQuery против Dojo против…)? и Самые большие ловушки GWT? , некоторые плакаты предполагают, что GWT недостаточно легок или являются лучшими альтернативами, которые могут быть использованы.

Чувствуете ли вы, что у большинства из вас есть проблемы с GWT, которые не были исправлены с помощью GWT 2.0 - что заставило бы вас предложить использовать более простую структуру для нового проекта?

В какой-то степени разве GWT не должен быть ориентирован на будущее (поскольку вам не нужно беспокоиться о том, что он резко изменится от релиза к релизу и поскольку он поддерживается Google)?

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

Ответы [ 3 ]

52 голосов
/ 20 января 2010

Компромиссы

Давайте начнем со всех компромиссов, которые я могу придумать:

  • вы используете Java - это означает, что знание javascript вашим webdevs не очень пригодится (будет полезно, если вы будете баловаться с JSNI)
  • проблемы с индексацией поисковыми системами - ИМХО, это должно быть самый большой недостаток использования GWT, или чистые веб-приложения JS в целом. Так как содержание, верстка, все создается "на лету" с JS, поисковая система увидит только очень короткая HTML-страница и это все - вы должен как-то позаботиться об этом себя (например, используя маскировка ). Google наконец-то начал работать над решением для это , однако это не похоже на привлекателен для меня.
    Обновление: У Google наконец-то решена эта проблема. Тем не менее, я оставлю это как компромисс, потому что для сканирования приложения по-прежнему требуется больше усилий, чем в других средах. По крайней мере, теперь у нас есть «стандарт», которому мы должны следовать, и нам не нужно использовать некоторые сомнительные методы (например, клоакинг ).
  • легко (особенно для новичка в GWT, , особенно , когда этот человек происходит из HTML / JS-фона - без слишком большого объектно-ориентированного опыта), чтобы пройти все "вау, эти" объектные "вещи так круто, позвольте мне превратить все мои <div> в отдельные объекты, которые сделают код красивым и аккуратным ". Конечно, я преувеличиваю это, но вы понимаете, в чем дело - легко представить, что неопытный программист может поставить полноценный Widget с большим количеством Handlers в каждой ячейке FlexTable .. И потом (а) он потратит немало времени на размышления о том, почему приложение чувствует себя вялым;) tl: dr: новичкам в GWT легко сделать свои приложения "раздутыми", написав код, который кажется соответствующим какую документацию / образцы / здравый смысл;) предложить

Это все для компромиссов, о которых я могу подумать - если кто-то хочет что-то добавить, пожалуйста, добавьте комментарии.

Преимущества

Теперь о преимуществах. Я собираюсь пропустить некоторые, такие как интернационализация , кросс-браузерная совместимость для бесплатной, легкой интеграции с другими библиотеками Google и т. Д., Потому что они довольно очевидны и их легко понять. Я попытаюсь сосредоточиться на менее подчеркнутых, но все еще очень важных особенностях:

Так что можно оптимизировать примерно так:

public class ShapeExample implements EntryPoint {
  private static final double SIDE_LEN_SMALL = 2;
  private final Shape shape = new SmallSquare();
  public static abstract class Shape {
    public abstract double getArea();
  }
  public static abstract class Square extends Shape {
    public double getArea() { return getSideLength() * getSideLength(); }
    public abstract double getSideLength();
  }
  public static class SmallSquare extends Square {
    public double getSideLength() { return SIDE_LEN_SMALL; }
  }
  public void onModuleLoad() {
    Shape shape = getShape();
    Window.alert("Area is " + shape.getArea());
  }
  private Shape getShape() { return shape; }
}

.. к этому:

public class ShapeExample implements EntryPoint {
  public void onModuleLoad() {
    Window.alert("Area is 4.0");
  }
}

А затем запутайте это и сведите к минимуму. Кроме того, это делается таким образом, что делает полученные файлы более сжимаемыми с помощью gzip.

  • вы используете Java - нравится ли вам Java, нет никаких сомнений что это очень хорошая объектно-ориентированная language , что позволяет писать простой в обслуживании и тестируемый код (то, что я не думаю, возможно в такой степени с JavaScript). Если Вы следуете некоторым хорошим правилам , вы получите код, который понятно не только для вас, но и для других разработчиков. Другая Стоит отметить, что все эти хорошие шаблоны дизайна и т. д., что работать в "чистой" Java, работать и здесь.
  • одна изящная вещь в GWT - это то, что вы получить прирост производительности и новые функции бесплатно почти с каждым новый выпуск фреймворка. поскольку это Java скомпилирован в JavaScript, это требуется только перекомпиляция, чтобы извлечь выгоду от оптимизаций, сделанных в новый компилятор или получите новые функции (такие как поддержка специальных возможностей , представленная в GWT 1.5).
  • отладка - стоит упомянуть, что вы можете (и должны :)) отлаживать свои приложения GWT, как и любое другое приложение Java, используя отладчик вашей IDE.И вообще, отладчики Java, которые я видел, более продвинуты, чем их аналоги из JavaScript.
  • UiBinder - хотя он все еще не "совершенен", UiBinder давайтеВы разрабатываете свои виджеты простым и интуитивно понятным способом, используя XML (в отличие от способа, предшествующего 2.0, который заставлял вас делать это в Java).Смешивать HTML и виджеты GWT еще никогда не было так просто и весело;)
  • работа с CSS - GWT всегда, конечно, принимал CSS, но с появлением GWT 2.0 (и UiBinder) они взяли это на другой уровень.Давайте посмотрим на файл CSS из «обычного» веб-приложения - сотни, если не тысячи строк, трудно ориентироваться, некоторые стили избыточны, но трудно заметить, что некоторые вообще не используются, добавьте к этому соединениюнужно порадовать IE6 / 7 и вы получите себе кошмар.С GWT вы можете поручить ему выполнять аналогичные задачи, которые он выполнял для кода JS для CSS - поэтому он удалит все неиспользуемые стили CSS, объединит, где это необходимо, сведет к минимуму и запутает имена классов, и многие другие (включая условные выражения, константы и т. д. в ваших CSS-файлах).Вам рекомендуется хранить свои стили в соответствующих XML-файлах UiBinder - это упрощает их организацию и поиск.Наконец, что не менее важно, вы получаете сообщение об ошибке при вводе имени стиля CSS - меньше хлопот, чем при попытке сделать то же самое с помощью Firebug или аналогичного инструмента
  • OOPHM - Режим Out of Process HostedЭтим они исправили один из самых больших недостатков GWT - теперь вы можете использовать Hosted Mode в браузере по вашему выбору (если вы выберете Firefox, Safari, IE или Chrome, но по крайней мере вы можете использовать любую версию, которую выхочу).Конструкция OOPHM также позволяет вам делать такие крутые вещи, как запуск Windows на виртуальной машине и подключение там из IE к размещенному режиму, работающему на основной ОС (Linux / MacOS) - нет необходимости в взломах, копировании файлов после каждой компиляции,и т.д.
  • Вы можете сказать / ˈɡwˈɡt / много;) (это цитата из одной из презентаций по Google IO 2009 , IIRC)
  • и многое другое.Посмотрите видео с Google IO 2009 и просмотрите вики GWT , чтобы увидеть больше материалов, которые делают создание RIA проще и менее подвержены ошибкам с GWT:)

Между

В зависимости от вашего опыта и / или предпочтений, следующие могут быть преимуществом (это для меня, но иногда это PITA;)) или нет:

  • коллекция виджетов из коробки небольшая и простая .Теперь, если вы работаете с какой-то полнофункциональной структурой графического интерфейса (будь то веб или настольный компьютер), вы можете быть удивлены тем, насколько малое количество виджетов GWT.Но, как утверждают разработчики GWT, все сделано специально: базовые виджеты - это все инструменты / «блоки», которые вам нужны для создания собственных, адаптированных под ваши потребности виджетов.Альтернативой является предоставление разнообразных универсальных виджетов, которые должны поддерживать множество вариантов использования ... В результате получается довольно медленный пользовательский интерфейс (по крайней мере, ИМХО - проверьте для себя такие проекты, как SmartGWT или Ext GWT ).То есть виджеты GWT довольно хорошо написаны - например, SuggestBox имеет много мест, где вы можете переопределить поведение по умолчанию своим собственным - вы можете указать другой способ отображения предложений(SuggestBox.SuggestionDisplay), запускать пользовательское действие, когда пользователь выбирает предложение (SuggestBox.SuggestionCallback), или просто предоставлять пользовательский SuggestOracle для подачиSuggestBox с Suggestion s ...

Итог - попробуйте GWT, скорее всего, вам понравится и вы никогда не захотите писать вчистый JavaScript когда-либо снова;)

10 голосов
/ 22 января 2010

Мы строим малые (~ 2K классы Java) для средних (~ 6K) корпоративных систем на регулярной основе с использованием GWT, начиная с версии 1.3. Я понимаю, что на общедоступном сайте, имеющем тысячу кликов в секунду, нужно решать другой набор проблем, но я постараюсь рассказать о наших самых больших проблемах в GWT 1.x и о том, как GWT 2.0 подходит к этому.

Утечки памяти в браузере Утечки в IE6 с GWT огромны, утечки в IE7 можно компенсировать периодическим обновлением страниц, IE8 обещает некоторую стабильность в этой области, но пока не получила широкого распространения на предприятии. И да, даже действительный код GWT без собственных вызовов JS в некоторых случаях приводит к утечке памяти. Особенно, когда пользовательский интерфейс сложен, и вы делаете много вызовов Panel.clear (). На данный момент нет полезных инструментов для определения реальной причины утечки. Если вы не знаете, как взломать сам браузер.

Производительность рендеринга Вы должны очень тщательно писать код пользовательского интерфейса, особенно при создании часто используемых пользовательских виджетов. Глубокие знания JavaScript, CSS и DOM все еще необходимы. В интернете много материалов на эту тему. Вам нужно знать, как и когда переходить с уровня виджета GWT на прямые манипуляции с DOM.

Размер загружаемого контента до версии 2.0 было невозможно разделить модуль на разные загружаемые фрагменты без встроенной «жесткой» навигации в приложении. Но это очистит контекст JavaScript и потребует перезагрузки окна.

Разработчики пользовательского интерфейса Mind Shift Опытные разработчики пользовательского интерфейса просто не знают Java и ООП. Опытные Java-разработчики не знают CSS, JS, HTML и не любят создавать пользовательский интерфейс. Пользовательский интерфейс Binder идет в правильном направлении.

Мы выполнили миграцию 1.3 -> 1.5 -> 1.7, и это всегда была просто перекомпиляция и пара CSS-исправлений. GWT 2.0 удаляет много устаревшего кода и исходных подходов (структура проекта, GWTShell) и может быть сложным для быстрой миграции. Но все функции выглядят многообещающе, и хорошо, что Google в какой-то момент отбросил устаревший код. Хотя я не уверен в стабильности 2.0, поскольку мы еще не использовали ее в реальных проектах.

Надеюсь, это поможет.

4 голосов
/ 20 января 2010

У нас есть приложение GWT с кучей приемочных испытаний Selenium.Я думал (как и вы), что было бы безопасно обновить GWT с 1,7 до 2,0.И это было - в основном.Приложение все еще работало для "человеческих" пользователей, но тесты на селен все провалились.В разработке находится более новая версия Selenium (в альфа-версии со многими UnsupportedOperations), но если мы хотим остаться с GWT 2, похоже, нам придется отказаться от некоторой тестируемости.Поэтому будьте осторожны с предположениями на будущее.

Наше решение использовать GWT было принято несколько месяцев назад после сравнения YUI и ZK.Я все еще рад, что мы выбрали GWT.Уровень поддержки на веб-сайте GWT и общее качество документации кажется очень высоким.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...