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

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

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

/com.example.EditorApp?id=1

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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