Depuis que GWT est sortie, je n'ai cessé de vanter ses mérites. Et pourtant, il y a un domaine sur lequel ce Framework n'excelle pas, celui de la gestion d'applications volumineuses. En effet, le compilateur GWT génère du code JavaScript dont le contenu et le volume est lié à la proportion de l'application cible. Plus l'application grossit, plus le code JavaScript a tendance à grossir, malgré le nombre incalculable d'optimisations opérées par le compilateur. Alors évidemment, il existe plusieurs procédés (que je traite dans un chapitre entier de la formation GWT) permettant de modulariser un site GWT. Mais toutes ces "astuces" (iframes, lazyloading, ...) ne peuvent être considérées comme de "vrais" patterns d'architecture. Il fallait une modification structurelle dans la manière de faire générer un site par le compilateur GWT. Un peu à la manière d'un Flex qui permet de charger dynamiquement au besoin un SWF, il fallait une sorte de chargement dynamique d'application GWT.
En parcourant rapidement les forums aujourd'hui, je suis tombé sur un thread qui m'a un peu interpellé pointant sur une fonctionnalité nouvelle. De fil en aiguille je suis tombé sur l'origine de cette fonctionnalité, qui existe bel et bien dans le trunk actuel de GWT (ne cherchez pas dans les release). L'ordre GWT.runAsync(). En googlisant, on s'aperçoit que très peu de pointeurs évoquent cette nouvelle instruction qui risque fort d'être LA gold feature de GWT 1.6.
Pour résumer la chose. Il sera possible à l'avenir de morceler une application GWT en plusieurs bouts de codes JavaScript. En fouillant rapidement le code source du trunk, je suis tombé sur la classe CodeSplitter dont le rôle est justement de diviser le script JS en plusieurs fragments (un peu à la manière d'un Echo2) intégré dans un package de plusieurs commits.
Charger un widget dynamiquement pourra être fait de la manière suivante (le showcase du trunk l'intègre) :
GWT.runAsync(new RunAsyncCallback() {
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
public void onSuccess() {
callback.onSuccess(onInitialize());
}
});
Cette feature ouvre la voie à de nouveaux horizons en repoussant les limites physiques imposés par un gros fichier JavaScript. On va enfin pouvoir gérer des applications volumineuses et briser la nature monolithique de GWT. Ecrire un ERP GWT est désormais possible.
Le train GWT est sur de bons rails...
Mais tu ne (Eclipse) RAP plus ? ;-)
Cette solution a cependant quelques inconvénients mais permet de développer en full java côté serveur.
La solution que vous évoquez semble intéressante mais il ne faudrait pas que ça devienne une usine à gaz.