Подтвердить что ты не робот

Почему GWT? Преимущества и возможности использования этой RIA-платформы

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

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

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

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

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

4b9b3361

Ответ 1

Компромиссы

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

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

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

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

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

  • компилятор - теперь большинство людей, с которыми я говорил о GWT, не осознают, насколько удивительна эта часть GWT - для начала попробуйте this презентация с прошлого года Google IO. Компилятор имеет представление о все приложение.

Таким образом, он может оптимизировать следующее:

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

Между

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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