Большие приложения в GWT: один модуль или несколько?

Чтобы обеспечить удобные URL-адреса между частями нашего приложения, мы разделили все на несколько модулей, которые компилируются независимо. Например, есть часть «менеджер» и часть «редактор». Редактор запускается в новом окне. Делая это, мы можем напрямую ссылаться на редактор:

/com.example.EditorApp?id=1

Модуль EditorApp просто получает значение id и загружает документ.

Проблема в том, что ВЕСЬ код, общий для двух модулей, дублируется в выводе. Это включает в себя любое статическое содержимое (графику), таблицы стилей и т. д.

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

Кто-нибудь имел дело с этим? Я рассматриваю возможность отказа от отдельных модулей и объединения их обратно в одну цель компиляции. Единственным недостатком является то, что URL-адреса между нашими «приложениями» становятся примерно такими:

/com.example.MainApp?mode=editor&id=1

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


gwt
person Mark Renouf    schedule 01.12.2008    source источник


Ответы (3)


Я создал несколько очень больших приложений в GWT и считаю, что лучше всего разделить их на модули и переместить общий код в отдельную область, как это сделали вы. Причина в нашем случае была проста: у нас были некоторые части нашего приложения, которые сильно отличались от остальных, поэтому это имело смысл с точки зрения размера компиляции. Наше приложение скомпилировано до 300 КБ для основного раздела и около 25-40 КБ для остальных разделов. Если бы мы просто объединили их все в один, пользователь получил бы загрузку размером 600 КБ, что для нас было неприемлемо.

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

Время компиляции - это не то, о чем вам обычно следует беспокоиться, потому что вы можете ускорить его, если у вас есть отдельные модули. Мы используем ant для сборки нашего проекта и настраиваем его на компиляцию только измененного GWT, а во время разработки — на сборку только для одного браузера, обычное время компиляции нашего проекта составляет 20 секунд, и у нас много кода. Вы можете увидеть и пример этого здесь.

Еще одна незначительная вещь: я полагаю, вы знаете, что вам не нужно использовать пути GWT по умолчанию, которые он генерирует? Поэтому вместо com.MyPackage.Package вы можете просто поместить его в папку с красивым именем, например «ui» или что-то в этом роде. Однажды скомпилированный GWT не заботится о том, куда вы его поместите, и не чувствителен к изменениям пути, потому что все он запускается из одного и того же каталога.

person rustyshelf    schedule 01.12.2008
comment
ссылка выглядит просроченной сейчас - person Monis Iqbal; 23.01.2014

Исходя из моего опыта создания приложений GWT, есть несколько вещей, которые следует учитывать при принятии решения о том, хотите ли вы несколько модулей (с точками входа или без них) или все в одном: время загрузки (размер пакета JavaScript), время компиляции, навигация/URL и ремонтопригодность/повторное использование.

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

... за время компиляции даже большие приложения компилируются довольно быстро, но это может помочь разбить большие приложения.

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

... для удобства сопровождения/повторного использования с точки зрения организации/структуры может быть полезно разделить на отдельные модули (даже если существует только одна точка входа).

Я написал сообщение в блоге об использовании модулей GWT, если это поможет.

person throp    schedule 22.02.2011

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

Наша основная сборка состоит из ряда внутренних и сторонних модулей. Все они управляются в отдельных проектах. Это имеет смысл, поскольку они используются в разных местах.

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

О размере... для нас один модуль был 280 КБ, а другой чуть более 300 КБ.

Я только что закончил объединять все обратно в один модуль. Новый комбинированный модуль весит около 380 КБ. Так что на самом деле загрузка немного меньше, так как почти все будут использовать оба экрана.

Также помните, что существует идеальное кэширование, поэтому 380 КБ должны быть загружены только один раз, если только приложение не будет изменено.

person Mark Renouf    schedule 03.12.2008
comment
наше приложение работает по протоколу HTTPS, поэтому кэширование нескольких посещений не выполняется, поэтому размер был для нас очень важен. Я думаю, что в большинстве случаев правильный ответ - разделить их для удобства обслуживания, управления и скорости компиляции. - person rustyshelf; 04.12.2008
comment
@rustyshelf: HTTPS не означает отсутствие кэширования. см. напр. эта запись в блоге о мифах о HTTPS - person törzsmókus; 10.03.2012