Pourquoi GWT? Avantages et avantages de l'utilisation de ce cadre RIA

J'ai lu beaucoup de questions «plus votées» pour GWT. Plusieurs de ces questions parlent des pièges ou des problèmes avec GWT.

Dans les articles: quel framework Javascript (jQuery vs Dojo vs …)? Et les plus grandes pièges de GWT? , Certaines affiches semblent suggérer que GWT n'est pas assez léger ou qu'il existe de meilleures alternatives qui peuvent être utilisées.

La plupart d'entre vous ont-ils l'impression qu'il y a des problèmes avec GWT qui n'ont pas été corrigés avec GWT 2.0 – ce qui vous inciterait à suggérer d'utiliser un cadre plus simple pour un nouveau projet?

Dans une certaine mesure, GWT ne devrait-il pas être un peu à l'épreuve du futur (puisque vous ne devez pas vous soucier que cela change drastiquement depuis la sortie vers la sortie et que Google appuie?

Je me rends compte que la réponse à cette question dépend beaucoup de ce que vous voulez faire ou de ce que vous souhaitez faire. Je regarde cela du point de vue du démarrage d'une nouvelle application Web qui sera éventuellement utilisée par des millions d'utilisateurs.

Réductions

Commençons par tous les compromis que je peux proposer:

  • Vous utilisez Java – cela signifie que la compétence de votre webdevs en javascript ne sera pas utile (cela vous sera utile si vous dabblez dans JSNI)
  • Les problèmes d'indexation par les moteurs de recherche – IMHO, cela devrait être le plus grand inconvénient de l'utilisation de GWT, ou des applications Web JS pures en général. Depuis le contenu, la mise en page, tout est créé «à la volée» avec JS, le moteur de recherche ne verra qu'une page HTML très courte et c'est ça – vous devez vous en occuper (par exemple, en utilisant un cloquage ) . Google a finalement commencé à travailler sur une solution pour cela , mais cela ne me semble pas attrayant.
    Mise à jour: Google a finalement abordé ce problème. Cependant, je laisserai cela comme un compromis parce que l'application crawable nécessite encore plus d'efforts que dans d'autres cadres. Au moins maintenant, nous avons un «standard» à suivre et nous ne devons pas utiliser certaines techniques douteuses (comme le cloquage ).
  • Il est facile (en particulier pour un débutant dans GWT, en particulier lorsque cette personne vient d'un fond de HTML / JS – sans trop d'expérience orientée objet) pour aller tout "wow, ces objets 'objet' sont tellement cool, laissez-moi faire tous mes <div> s dans des objets distincts, ce qui rendra le code sympa et soigné ". Bien sûr, je l'exagère, mais vous comprenez le problème: il est facile d'imaginer qu'un programmeur inexpérimenté puisse mettre un Widget complet avec beaucoup de Handlers dans chaque cellule d'un FlexTable … Et puis (s) Il va perdre beaucoup de temps à se demander pourquoi l'application se sent lentement;) tl; dr: il est facile pour les débutants de GWT de rendre leurs applications "bloaty" en écrivant un code qui semble être conforme à la documentation / samples / sens commun; ) Suggèrent

C'est tout pour les compromis que je peux penser – si quelqu'un veut ajouter quelque chose, ajoutez des commentaires.

Avantages

Maintenant pour les avantages. Je vais sauter un peu comme l' internationalisation , la compatibilité entre les navigateurs pour une intégration gratuite et facile avec les autres bibliothèques de Google, etc., car elles sont un peu évidentes et faciles à saisir. Je vais essayer de me concentrer sur les caractéristiques moins soulignées, mais toujours très importantes:

  • Le compilateur – maintenant, la plupart des personnes avec qui j'ai parlé à propos de GWT ne se rendent pas compte de la façon dont cette partie de GWT est étonnante. Pour commencer, essayez cette présentation de Google IO de l'année dernière . Le compilateur a la vue de l'ensemble de l'application.

Donc, il peut optimiser un tel genre:

 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; } } 

..pour ça:

 public class ShapeExample implements EntryPoint { public void onModuleLoad() { Window.alert("Area is 4.0"); } } 

Et puis obscurcir cela et minimiser. En outre, cela se fait de cette façon, ce qui rend les fichiers résultants plus compressibles via gzip.

  • Vous utilisez Java – que vous aimiez ou non Java, vous ne pouvez pas nier qu'il s'agit d'un très bon langage orienté objet, qui permet d'écrire facile à maintenir et à tester un code (quelque chose que je ne pense pas être possible avec JavaScript ). Si vous suivez de bonnes directives , vous arriverez à un code compréhensible non seulement pour vous, mais aussi pour les autres développeurs. Une autre chose à mentionner est que tous ces jolis modèles de conception, etc., qui fonctionnent dans Java "pure", fonctionnent ici aussi.
  • Une bonne chose à propos de GWT est que vous obtenez des gains de performance et de nouvelles fonctionnalités gratuitement avec presque toutes les nouvelles versions du framework. Comme Java est compilé sur JavaScript, il ne faut qu'une recompilation pour profiter des optimisations réalisées dans le nouveau compilateur ou obtenir de nouvelles fonctionnalités (comme le support d'accessibilité introduit dans GWT 1.5).
  • Débogage – il convient de mentionner que vous pouvez (et devriez :)) déboguer vos applications GWT comme n'importe quelle autre application Java, en utilisant le débogueur de votre IDE. Et, en général, les débogueurs Java que j'ai vus sont plus avancés que leurs homologues JavaScript.
  • UiBinder – alors qu'il n'est toujours pas «parfait», UiBinder permet de concevoir vos Widgets de manière simple et intuitive en utilisant XML (par opposition à la manière pré-2.0 qui vous a forcé à faire cela en Java). Le mélange des widgets HTML et GWT n'a jamais été aussi simple et amusant;)
  • En travaillant avec CSS – GWT a, bien sûr, embrassé CSS, mais avec l'introduction de GWT 2.0 (et UiBinder), ils l'ont porté à un autre niveau. Regardons un fichier CSS à partir d'une application Web "normale": des centaines, sinon des milliers de lignes, difficiles à naviguer, certains styles sont redondants, mais il est difficile de remarquer que certains ne sont pas utilisés du tout, ajoutez à ce mélange le Besoin de faire plaisir à IE6 / 7 et vous faites un cauchemar. Avec GWT, vous pouvez l'instruire pour effectuer les tâches similaires qu'il a faites pour le code JS pour CSS – afin de tailler tous les styles CSS inutilisés, fusionner le cas échéant, minimiser et masquer les noms de classe, et bien d'autres (y compris les conditionnels, les constantes , Etc. dans vos fichiers CSS). Vous êtes encouragé à garder vos styles dans les fichiers XML d'UiBinder respectifs, ce qui facilite l'organisation et leur découverte. Last but not least, vous obtenez une erreur lorsque vous avez mal orthographié un nom de style CSS – moins de tracas puis essayez de faire la même chose via Firebug ou un outil similaire
  • OOPHM – Out of Process Hosted Mode, avec cela, ils ont corrigé l'un des plus grands inconvénients de GWT. Maintenant, vous pouvez utiliser le Mode hébergé dans le navigateur de votre choix (si ce choix est Firefox, Safari, IE ou Chrome, mais à Vous pouvez au moins utiliser toute version souhaitée). La conception d'OOPHM vous permet également de faire des trucs géniaux comme exécuter Windows dans une machine virtuelle et de vous connecter depuis le IE au mode hébergé en cours d'exécution sur le système d'exploitation hôte (Linux / MacOS) – pas besoin de hacks, de copier des fichiers après chaque compilation, etc
  • Vous parlez / bien / beaucoup;) (ceci est une citation d'une des présentations sur Google IO 2009 , IIRC)
  • Beaucoup plus … Regardez les vidéos de Google IO 2009 et parcourez le wiki GWT pour voir plus de choses qui rendent la création de RIA plus facile et moins propice aux erreurs avec GWT 🙂

Entre

Selon votre expérience et / ou vos préférences, ce qui suit pourrait être un avantage (c'est pour moi, mais parfois c'est un PITA;)) ou non:

  • La collection de Widgets hors boîte est petite et simple . Maintenant, si vous venez d'un cadre graphique complet (qu'il s'agisse de Web ou de bureau), vous pourriez être surpris de voir combien relativement petit est le nombre de Widgets GWT. Mais selon les développeurs de GWT, il est toujours tenu comme objectif: les Widgets de base sont tous les outils / "blocs" dont vous avez besoin pour créer vos propres, personnalisés selon vos besoins Widgets. L'alternative est de fournir une variété de widgets polyvalents qui doivent supporter de nombreux cas d'utilisation … Le résultat est une UI légèrement douteuse (au moins IMHO – vérifiez pour vous des projets comme SmartGWT ou Ext GWT ). C'est-à-dire que les GWT Widgets sont très bien écrits – par exemple, SuggestBox a beaucoup d'endroits où vous pouvez remplacer le comportement par défaut par vous-même – vous pouvez spécifier un mode différent pour afficher les suggestions ( SuggestBox.SuggestionDisplay ), Action personnalisée lorsque l'utilisateur sélectionne une suggestion ( SuggestBox.SuggestionCallback ) ou fournit simplement un SuggestOracle personnalisé pour alimenter SuggestBox avec Suggestion s …

La ligne de fond est – essayez GWT, il est probable que vous l'aimerez et que vous ne voudrez plus jamais écrire dans pure JavaScript;)

Nous construisons des classes petites (~ 2K classes Java) à moyennes (~ 6K) d'entreprise régulièrement en utilisant GWT depuis la sortie de la version 1.3. Je comprends qu'il existe un ensemble différent de problèmes à résoudre dans un site public ayant des milliers de clics par seconde, mais j'essaierai de parler de nos plus gros problèmes dans GWT 1.x et de la façon dont GWT 2.0 s'approche de cela.

Flux de mémoire du navigateur Les fuites IE6 avec GWT sont formidables, les fuites IE7 peuvent être compensées par des actualisations périodiques de pages, IE8 promet une certaine stabilité dans ce domaine, mais pas encore largement accepté dans l'entreprise. Et oui, même le code GWT valide sans les appels JS natifs renverse la mémoire dans certains cas. Surtout quand UI est complexe et vous faites beaucoup d'appels Panel.clear (). Il n'existe aucun outil utile pour identifier la cause réelle de la fuite en ce moment. Sauf si vous savez comment pirater le navigateur lui-même.

Performances de rendu vous devez écrire votre code UI avec beaucoup d'attention, surtout lorsque vous créez des widgets personnalisés couramment utilisés. Des connaissances profondes en JavaScript, CSS et DOM sont encore nécessaires. Il existe beaucoup de matériel sur Internet sur ce sujet. Vous devez savoir comment et quand descendre du niveau de widget GWT pour manipuler DOM directement.

Taille du contenu téléchargeable, il était impossible avant 2.0 de diviser le module sur différentes pièces téléchargeables sans avoir une navigation "difficile" dans l'application. Mais cela effacera le contexte de JavaScript et nécessitera un rechargement de fenêtre.

UI Developers Mind Shift Les développeurs d'interface utilisateur expérimentés ne connaissent pas Java et OOP. Les développeurs Java expérimentés ne connaissent pas CSS, JS, HTML et n'aiment pas créer de l'interface utilisateur. UI Binder va dans la bonne direction.

Nous avons effectué la migration 1.3 -> 1.5 -> 1.7 et c'était toujours juste une recompilation et quelques corrections CSS. GWT 2.0 supprime beaucoup de code obsolète et les approches initiales (structure de projet, GWTShell) et peuvent être difficiles à migrer rapidement. Mais toutes les fonctionnalités semblent prometteuses et il est bon que Google ait abandonné un code hérité à un moment donné. Je ne suis pas sûr de la stabilité de 2,0 cependant, car nous ne l'avons pas encore utilisé dans des projets réels.

J'espère que cela t'aides.

Nous avons une application GWT avec un tas de tests d'acceptation de Selenium. Je pensais (comme vous) qu'il serait sûrement sécurisé de passer GWT de 1.7 à 2.0. Et c'était – surtout. L'application a toujours fonctionné de la même façon pour les utilisateurs "humains", mais les tests de sélénium ont tous éclaté. Il existe une version plus récente de Selenium en préparation (à la version alpha, avec de nombreuses opérations non prises en charge), mais si nous voulons rester avec GWT 2, il semble que nous devons abandonner une certaine stabilité. Faites donc attention aux hypothèses «à l'épreuve du futur».

Notre décision d'utiliser GWT a été faite il y a quelques mois, après avoir comparé YUI et ZK. Je suis toujours heureux d'avoir choisi GWT. Le niveau de soutien sur le site Web de GWT et la qualité générale de la documentation semblent très élevés.

GWT fait le partage de modules et fournit un profil de performance qui aide à contrer les arguments qu'il n'est pas assez léger.