GWT: Модуль против ClientBundle?

Я новичок в GWT, и мне трудно понять фундаментальные различия между Module и ClientBundle. Оба кажутся одним и тем же в некоторых областях документации GWT, тогда как в других областях ясно, что они не совпадают.

Насколько я понимаю, модуль — это код на стороне клиента, который развертывается в браузерах ваших пользователей. Это ZIP-файл, содержащий HTML, CSS и JS.

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

Если эти понимания верны, то зачем нужно проводить различие между ними? Разве HTML/CSS/JS тоже не являются статическими ресурсами?!? И если я ошибаюсь, пожалуйста, помогите мне понять, в чем заключаются различия, и, возможно, приведите конкретный пример каждого и когда уместно использовать каждый из них. Заранее спасибо!


person IAmYourFaja    schedule 22.08.2012    source источник


Ответы (1)


У вас есть правильное представление о модуле - он описывает (на стороне разработки) исходные пути Java для использования, точки входа для начала компиляции и различные свойства (браузеры, локали) для использования при компиляции. После компиляции модуль также представляет выходные данные — javascript и любые связанные с ним другие скомпилированные файлы, будь то журналы, изображения, таблицы стилей и т. д.

Напротив, ClientBundle — это один из способов, с помощью которого разработчик может сообщить компилятору, что определенные ресурсы в исходном пути java будут использоваться после компиляции. CssResource поставляется с дополнительными проверками того, используются ли имена стилей css (и если нет, их следует удалить, чтобы свести к минимуму скомпилированный вывод), ImageResource гарантирует, что файл существует при компиляции, и оба выводят эти файлы наилучшим образом оптимизированным способом для каждого браузера. Изображения для большинства браузеров на самом деле включены в массивный JS-файл, чтобы свести к минимуму количество обращений к серверу, а для тех, которые не поддерживают это, они автоматически объединяются спрайтами.

Объявляя интерфейс ClientBundle и вызывая GWT.create(MyClientBundle.class), вы просите компилятор разобраться со спецификой ClientBundle, чтобы сделать эти файлы и классы, на которые ссылаются, доступными в вашем приложении. Как это связано с генераторами GWT, гораздо более сложной темой, чем можно рассмотреть в ответе SO...

Да, ClientBundles описывают статические ресурсы, которые необходимы работающему приложению, и да, скомпилированный модуль состоит из различных статических ресурсов, но я бы перефразировал ваше понимание, чтобы выразить это так: способ: ClientBundle — это один из способов включения статического контента в модуль GWT таким образом, чтобы он загружался максимально эффективно.

person Colin Alworth    schedule 22.08.2012
comment
Спасибо @Colin Alworth за отличный ответ (+1) - однако я все еще вполне не вижу здесь леса за деревьями... возможно, придерживаясь вашего примера CssResource или ImageResource, не могли бы вы показать мне структуру каталогов, включающую как модуль, так и один из этих ClientBundles внутри одного и того же проекта, и связать их с окончательным выводом, который отправляется обратно в клиентский браузер? Еще раз спасибо! - person IAmYourFaja; 22.08.2012
comment
Структура довольно проста — объявите субинтерфейс CssResource, затем создайте тип ClientBundle в том же пакете, что и набор изображений и файлов css, с аннотациями @Source, отображающими методы ClientBundle в файлы. Вывод сложнее, так как особенно для изображений он зависит от браузера, но CSS всегда запекается в окончательный скомпилированный JS и вводится только при необходимости. Мне нравится developers.google.com/web-toolkit/doc/latest/ как обсуждение того, как его использовать, а также несколько примеров - если это недостаточно ясно, я исправлю ответ. - person Colin Alworth; 23.08.2012