Quels sont les avantages éprouvés d'outils comme GWT par rapport aux cadres JavaScript purs?

11

GWT est une pile logicielle qui traduit le code Java et un sous-ensemble de la bibliothèque de classes de Java Runtime en code JavaScript.

En comparaison avec les boîtes à outils JavaScript, GWT peut sembler aliénant, par nature et par utilisation, et trop complexe pour faire des choses même simples, supprimant une grande partie du contrôle fin que vous auriez en utilisant directement JavaScript.

Pourquoi un développeur Web choisirait-il d'utiliser un outil comme GWT, qui utilise un langage initialement non ciblé pour le Web, au lieu d'utiliser des cadres et des boîtes à outils JavaScript et JavaScript purs?

Est-il mesurablement meilleur et basé sur quels critères?

Sourav Majumder
la source

Réponses:

27

Batteries incluses

Outillage Java

C'est tout simplement génial:

  • IDE: même si certains IDE prennent en charge JavaScript, le niveau de support n'est tout simplement pas comparable. Essayez de refactoriser le code JavaScript sur de grandes bases de code (disons, 40K + LOC) et pleurez.
  • Tests unitaires: bien que cela ait repris au cours des dernières années, il est également beaucoup plus mature dans le monde Java.
  • Intégration continue et inspection continue
  • Génération de documentation: vous avez bien sûr JSDoc et quelques autres

Typage statique

Il détecte les bogues tôt. (Google Closure adresse cela un peu tout en gardant le développeur dans le monde JavaScript, si vous préférez).

JavaScript optimisé

GWT écrit du JavaScript plus rapide et plus compact que vous (pour les grandes applications) et vous permet de déterminer ce qui est envoyé au client sans doute plus facilement qu'avec des solutions JS complètes équivalentes.

Architecture

Il offre une bonne séparation des préoccupations pour les grandes applications, avec des architectures MVC ou MVP décentes déjà précuites au bout de vos doigts.

Bibliothèque décente

GWT fournit des bibliothèques intéressantes et facilite (enfin, plus facilement) la création d'applications compatibles I18N avec un chargement de bundle dynamique.

Tests unitaires

Utilisation de JUnit depuis Eclipse IDE et depuis la ligne de commande. Cela concerne mon premier point. Vous pourriez très bien également utiliser certains des outils de qualité de code Java sur un projet GWT (pour les vérifications de source, pas les vérifications de bytecode, car il n'y en a pas).

Tout dépend de vous!!

GWT n'est pas pour tout le monde. Cela rend certaines personnes plus productives et donne un bon outil aux développeurs non JS pour créer des applications Web professionnelles avec des frontaux dynamiques sans toucher (trop) à JavaScript. Mais si cela ne fonctionne pas pour vous, utilisez simplement autre chose.

Si vous voulez la plupart des éléments ci-dessus mais que vous ne voulez tout simplement pas Java, regardez peut-être Google Closure ou le Dojo Toolkit .

C'était une bonne idée à l'époque: l'histoire compte !!

Le monde JavaScript (et les technologies Web frontales en général) est extrêmement actif de nos jours, donc les choses s'améliorent. Mais il y a seulement quelques années, les choses n'étaient pas si brillantes. LESS / SASS n'était pas si populaire, jQuery n'était pas encore la bibliothèque JS de sortie d'usine, les bibliothèques JavaScript n'étaient pas générées toutes les deux semaines et l'outillage n'était pas génial en général.

Mais il y avait déjà une demande croissante pour des applications Web professionnelles et volumineuses avec des frontaux dynamiques, il y avait donc une lacune à combler pour rendre les développeurs plus productifs. JavaScript a de nombreux pièges et bizarreries dont vous devez être conscient, et il est peut-être préférable de ne même pas avoir à s'en soucier. D'où la niche des outils comme GWT.

Depuis, d'autres sont apparus (CoffeeScript me vient à l'esprit, Dart est en route, mais aussi de grands frameworks JavaScript, la révolution du JS côté serveur avec Node.JS et autres, et un retour en force pour JavaScript comme «assez bon» tout -langage à utiliser non seulement côté client mais également dans d'autres parties de votre pile métier.


Notes complémentaires

En ce qui concerne votre question originale (maintenant éditée) sur l'utilisation de Firebug

Vous pouvez déboguer du code GWT avec Firebug bien sûr, mais idéalement, vous devriez le déboguer directement à partir du débogueur de l'IDE Eclipse, qui fournit désormais une prise en charge du débogage de code en direct.

Cependant, Firebug est toujours utilisable, mais vous devez garder à l'esprit que GWT génère du JavaScript optimisé et compressé, ce qui peut ne pas être facile à déboguer tel quel.

Concernant votre question originale (maintenant éditée) sur CSS

Oui, vous devez toujours écrire le code CSS vous-même, bien sûr. Vous associez votre projet GWT à d'autres outils (comme SASS), plus ou moins facilement.

Ce n'est qu'un outil!

Ne confondez pas GWT avec ce qu'il n'est pas: vous n'écrivez pas de code Java à exécuter directement côté client en tant que bytecode Java. Vous écrivez du code dans le langage Java, qui est ensuite traduit en JavaScript pour plus d'efficacité et pour vous permettre d'utiliser un langage de niveau supérieur (ou, du moins, c'est ainsi que cela doit être vu).

Sans doute , Java et JavaScript pourraient être considérés comme comparables en termes de niveaux d'abstraction. Cependant, Java présente certains avantages (détaillés ci-dessus), d'où l'avantage de profiter des avantages des outils existants sans avoir à les réécrire. Les développeurs de Google ont juste eu la bonne idée de permettre de réutiliser les outils orientés Java existants, mais de développer en effet des applications JavaScript.

De plus, ils résolvent un autre problème, qui était la gestion souvent lourde des applications Web bilingues où le code JavaScript et Java était traité séparément. L'utilisation de GWT permet un certain niveau de convergence pour les deux côtés du processus de développement.


Lectures complémentaires:

haylem
la source
"On peut soutenir que Java et JavaScript peuvent être considérés comme comparables en termes d'expressivité." Blague? La fonctionnalité équivalente en Java est environ 5 fois plus longue.
kevin cline
@kevincline: correct, je ne voulais pas écrire l'expressivité, je voulais dire en termes de niveaux d'abstractions. Merci de l'avoir repéré (il est 2h du matin ...)
haylem
6
@kevincline: en plus j'ai dit "défendable", et les fanatiques purs et durs d'une langue ou d'une autre argumenteraient n'importe quoi :)
haylem
1
En plus des éléments de @ Halem, je voudrais ajouter que l'OO basé sur le prototype de JavaScript peut être un peu étrange pour quelqu'un provenant d'un système basé sur des classes comme Java. La cohérence de l'approche est souvent utile.
Matthew Flynn
@MatthewFlynn: et vice-versa: c'est pourquoi les développeurs JS purs ont certainement plus de mal à monter dans le wagon à bandes GWT, ou à utiliser des cadres plus lourds qui reproduisent plus ou moins un paradigme OO basé sur une classe.
haylem
6

Après avoir passé des années à développer une application Web dans GWT, mon opinion est que GWT présente des inconvénients si graves que je ne l'utiliserais plus si je n'y suis pas obligé.

Arbre DOM

Bien que les performances JavaScript puissent être meilleures, l'arborescence DOM rendue est souvent inutilement complexe. Par exemple, l'implémentation de l'arborescence utilise plus de 13 éléments DOM, y compris une <table> pour chaque élément individuel. L'utilisation de grands arbres (environ 10000 éléments) gèle simplement le navigateur. Un arbre pur JavaScript / HTML / CSS était capable de gérer facilement la même quantité d'éléments.

Développement

Le cycle de modification-essai de la source pure JavaScript / HTML / CSS ne peut pas être battu. Vous enregistrez simplement votre fichier source et actualisez la page dans le navigateur. C'est un facteur clé de la productivité et GWT ne peut tout simplement pas rivaliser même en utilisant un serveur de code.

Le débogage de JavaScript est absolument simple et agréable avec le débogueur de Chrome ou Firebug.

Experts Hammer

L'idée d'utiliser Java pour tout est pour les développeurs qui sont des "experts en marteau". Ils sont maîtres de leur marteau donc tout est un clou. Je pense que cette approche est très fausse. L'utilisation de GWT nécessite également une connaissance de CSS et HTML. Sans cela, les développeurs de GWT se heurtent souvent à des problèmes qu'ils trouvent presque impossible à résoudre, tandis qu'une personne ayant une expérience HTML / CSS peut trouver une solution. Si les développeurs ont besoin de cette compétence, ils peuvent obtenir plus facilement en développant en HTML.

Mon avis est que la plupart des avantages fournis par GWT sont au moins discutables tandis que les inconvénients sont beaucoup plus graves par rapport au développement en JavaScript / HTML / CSS pur.

Zsolt Sky
la source
2

Ce n'est pas beaucoup mieux.
Pour un usage quotidien, pensez à jQuery , AmpleSDK ou à un polyfill html5 .

GWT a beaucoup de frais généraux: réels et conceptuels.

Cela pourrait être utile si vous avez une application java ou du code java côté serveur à porter sur une interface Web.

ZJR
la source
Vous voulez dire ClojureScript. Clojure lui-même un langage basé sur LISP ciblant la JVM. ClojureScript est celui qui produit le code JS.
haylem
Oui, j'avais déjà édité ça, de toute façon. Garder les choses simples.
ZJR
2

Je pense à peu d'avantages de l'utilisation de GWT (plus de détails lire mon blog http://www.pandurangpatil.com/2012/09/benefits-of-using-gwt.html )

  1. Comme l'application cliente GWT est écrite en Java, on a la possibilité de détecter des erreurs syntaxiques au moment de la compilation à cause de la même chose (bien qu'elle ne prenne pas en charge toutes les classes JRE car ces fonctionnalités ne sont pas prises en charge par les navigateurs eux-mêmes). Prenons un exemple pour comprendre ce que je dis. Si vous mal orthographiez un nom de variable JavaScript en utilisant une bibliothèque JavaScript pure. La seule façon de détecter une telle erreur est d'exécuter l'application et de tester les résultats souhaités. Les fonctionnalités Java comme les génériques et les annotations sont entièrement utilisées et peuvent être utilisées dans votre application.

  2. On peut faire usage des bibliothèques disponibles existantes ou en écrire une pour générer du code selon les exigences avec facilité car le code qui doit être généré doit être en Java. Le compilateur GWT se charge de le compiler et de le convertir en JavaScript.

  3. La gestion du code devient plus facile.

  4. On peut simplement écrire une logique métier commune de telle manière qu'elle puisse être utilisée dans le code côté client GWT et également sur le code côté serveur comme en Java, par exemple la validation des données ou certaines fonctions utilitaires communes.

  5. Avec l'utilisation du plug-in GWT eclipse, vous pouvez facilement déboguer le code client en Java pour votre logique métier.

  6. Lorsque le compilateur GWT compile le code Java de votre client et en génère du JavaScript. Dont vous avez besoin de le déployer sur votre serveur, et il est servi et exécuté dans le navigateur de l'utilisateur à la demande. Lors de la génération de ce JavaScript, il effectuera quelques optimisations.

    • Il ne prend pas en compte le code mort lors de la génération de JavaScript, quand je dis code mort, je veux dire "code qui est là mais qui n'est pas appelé depuis le flux principal". À son tour, réduit la taille effective de votre code JavaScript final.

    • Il prend en charge l'obscurcissement du code JavaScript généré.

    • Il fait la minification du code JavaScript généré.

    • Et plus important encore, il générera séparément du code optimisé spécifique au navigateur. Quand je dis séparément, cela générera un JavaScript séparé spécifique au navigateur qui sera servi lorsque la demande respective sera reçue du navigateur donné. Ce qui à son tour réduit la taille du code JavaScript qui est téléchargé pour un navigateur spécifique car il ne contient pas toutes les manipulations spécifiques au navigateur dans un seul code.

  7. Si vous rédigez votre candidature pour différentes langues, à savoir l'anglais, l'hindi, le marathi, etc. en utilisant la fonction d'internationalisation de GWT. Lors de la génération du code JavaScript, il crée une copie par combinaison de langue et de navigateur. Ce qui rend le code JavaScript généré pour une combinaison donnée de langue et de navigateur le plus optimal et le plus petit.

  8. Dans le cas où vous devez utiliser du JavaScript direct qui peut être appelé à partir du code Java GWT, vous pouvez le faire en utilisant JSNI (JavaScript Native Interface). On peut même rappeler GWT Java Code depuis JavaSctipt.

  9. Si vous souhaitez créer des pages capables de créer des signets, vous pouvez utiliser la fonction Historique de GWT.

  10. Si vous souhaitez utiliser JSON comme format de données pour la communication et la manipulation, il a une très bonne fonctionnalité appelée JavaScript Overlay Types.

  11. La fonction de liaison différée de GWT est une bonne fonctionnalité que je suppose qu'il est possible de fournir en raison de Java.

  12. Vous pouvez créer votre interface utilisateur à l'aide des widgets disponibles de GWT dans le style Java Swing. Vous pouvez même créer vos widgets personnalisés très facilement.

  13. Si vous souhaitez créer votre interface utilisateur (pages Web) dans un style html pur, vous pouvez utiliser la fonction d'interface déclarative de GWT. Je pense que c'est l'une des principales caractéristiques de GWT. Ce qui permet au développeur de créer plus facilement des pages dans un style HTML pur. Ce qui, je suppose, est plus facile à gérer que le codage de style Swing. Et surtout, vous pouvez toujours avoir votre logique en Java et seulement une partie de présentation en HTML pur. (Remarque: quelle que soit la méthode que vous utilisez (interface utilisateur déclarative ou style Swing), cela ne sera finalement que HTML, mais ce qui fait la différence, c'est la façon dont vous codez et maintenez-le).

  14. La fonctionnalité Client Bundle de GWT facilite la gestion de vos autres ressources Web telles que CSS, images et autres contenus texte.

    • Les ressources CSS permettent d'avoir une logique conditionnelle à l'intérieur de votre CSS. Vous pouvez également accéder à certaines valeurs dynamiques à partir de votre code Java côté client GWT.
    • Il se chargera également de brouiller vos cours CSS. Et surtout, GWT a automatisé la génération d'interfaces à partir de vos fichiers css pour utiliser les classes css.
    • La ressource d'image permet au développeur d'utiliser plus facilement les images dans votre application de manière très facile à gérer. Quand je dis facilement, je veux dire quand vous voulez utiliser des images en code Java GWT plutôt que d'utiliser une URL codée en dur, vous pouvez utiliser une ressource d'image. L'avantage que vous obtiendrez en utilisant une ressource d'image est que si vous allez changer l'emplacement ou utiliser une image différente avec un nom différent, il vous suffit de la changer à un endroit. La caractéristique la plus importante de la ressource d'image est lorsque vous l'utilisez avec une ressource CSS comme image-objet. Il se chargera de créer cette image sous forme d'URI de données en ligne ou de l'utiliser avec un sprite. Je ne dis pas qu'il n'est pas possible de le faire avec d'autres frameworks, ce qui est plus important, c'est la rapidité et la facilité avec laquelle vous pouvez le faire. GWT vous facilite la tâche.
    • La ressource de données ajoute une optimisation pour les fichiers de données comme .pdf pour renommer ces fichiers en fonction de leur contenu pour le rendre fortement cacheable par le navigateur. Les petits fichiers de données peuvent être convertis en uri de données en ligne.
    • En utilisant Client Bundle pour d'autres ressources Web et si vous structurez correctement votre application en différents modules. Il peut devenir des modules entièrement réutilisables dans leur ensemble avec chaque ressource. Quel est le gros problème des modules réutilisables? bien si vous utilisez des images en utilisant l'URL directe dans un module. Et si vous incluez ce module dans un autre module et essayez d'utiliser les composants créés dans ce module, vous devez toujours copier ces images sur l'URL publique de votre application finale. Ce que vous n'avez pas à faire si vous utilisez ces images comme ressources d'image.
    • Autre optimisation que vous pouvez réaliser en créant de petits modules en utilisant le bundle client pour css et images. Où vous pouvez choisir d'inclure uniquement les modules requis dans vos modules finaux. La différence que cela fera est le JavaScript du module final et les autres ressources ne contiendront que le contenu requis et non le contenu entier même si vous souhaitez utiliser un petit morceau du module.
  15. Widgets cellulaires: pour présenter la collecte de données paginées, GWT dispose de widgets cellulaires. Il existe des widgets comme CellTable, CellList, CellTree et CellBrowser.

    • CellTable est destiné à présenter des données sous forme de tableau paginé, il a une fonction dans laquelle vous pouvez modifier le contenu d'une cellule donnée en place. Il prend en charge la pagination côté client et côté serveur, prend en charge le tri sur colonne et prend également en charge la sélection d'un ou plusieurs enregistrements et la génération d'événements pour le même.
    • CellList peut être utilisé pour présenter des données au format liste et les éléments peuvent être affichés au format personnalisé. Il prend également en charge la pagination côté client et serveur et la sélection d'un ou plusieurs enregistrements et génère des événements pour la sélection. CellTree et CellBrowser peuvent être utilisés pour présenter des données sous forme d'arborescence.
  16. Communication avec le serveur à partir du code client GWT. Il prend en charge plusieurs façons de mettre en œuvre la communication client-serveur.

    • Si vous n'êtes pas préoccupé par le protocole utilisé pour le transfert de données, il s'agit du mécanisme GWT RPC. Il est très facile d'intégrer votre code côté client pour le transfert de données avec le serveur. Vous pouvez définir des DTO personnalisés (objet de transfert de données) dans le code client qui peuvent même être utilisés sur le code côté serveur. L'implémentation côté serveur accepte les mêmes DTO en tant que paramètre ou valeur de retour. Tout le reste est pris en charge par le travail de trame GWT RPC. Il propage même les exceptions levées du code côté serveur à l'appelant dans le code côté client (à condition que vous deviez définir ces classes d'exception dans le package de code côté client. GWT RPC utilise en interne les appels AJAX avec leur propre protocole personnalisé pour le transfert de données.

    • Si vous ne souhaitez pas utiliser GWT RPC, vous pouvez effectuer des appels serveur AJAX pour récupérer les données du serveur à l'aide de Request Builder. Ce qui est également beaucoup plus facile à mettre en œuvre. Il a également une fonctionnalité intéressante Request Factory. Avec cette fonctionnalité, vous pouvez rendre votre couche DAO ou Service exposée pour être appelée à partir du code client. Pour ce faire, vous devez définir quelques ensembles d'interfaces pour votre service et les types de données personnalisés. Et en utilisant ces interfaces, vous pouvez accéder à ces services à partir du code client. J'ai écrit le plugin maven pour générer ces interfaces. Si vous annotez votre couche DAO avec certaines annotations requises, reportez-vous à ( https://github.com/pandurangpatil/gwt-mvn-helper) référez-y le module mvn-helper-test pour son utilisation. Request Factory est plus ciblé pour s'intégrer à la couche ORM comme JDO ou JPA sur le serveur. Il a un support pour appeler persist sur une entité donnée à partir du code client. Et le plus important lorsque vous appelez la méthode persist, il calcule et envoie uniquement les modifications (delta) au serveur pour les enregistrer.

    • Si vous souhaitez effectuer un appel JSONP interdomaine, vous pouvez faire la même chose.

Pandurang Patil
la source