¿Cuáles son las ventajas comprobadas de herramientas como GWT sobre frameworks de JavaScript puro?

11

GWT es una pila de software que traduce el código Java y un subconjunto de la biblioteca de clases de Java Runtime a código JavaScript.

En comparación con los kits de herramientas de JavaScript, GWT puede parecer alienante, por naturaleza y por uso, y demasiado complejo para hacer incluso cosas simples, quitando gran parte del control detallado que tendría al usar JavaScript directamente.

¿Por qué un desarrollador web optaría por utilizar una herramienta como GWT, que utiliza un lenguaje originalmente no dirigido a la web, en lugar de utilizar marcos y herramientas de JavaScript y JavaScript puros?

¿Es mediblemente mejor y se basa en qué criterios?

Sourav Majumder
fuente

Respuestas:

27

Baterias incluidas

Herramientas de Java

Es simplemente asombroso:

  • IDEs: incluso si algunos IDE admiten JavaScript, el nivel de soporte simplemente no se compara. Intente refactorizar el código JavaScript en bases de código grandes (por ejemplo, 40K + LOC) y llore.
  • Pruebas unitarias: aunque eso aumentó en los últimos años, también es mucho más maduro en el mundo de Java.
  • Integración continua e inspección continua
  • Generación de documentación: seguro que tiene JSDoc y algunos otros

Tipificación estática

Atrapa insectos temprano. (Google Closure aborda eso un poco mientras mantiene al desarrollador en el mundo de JavaScript, si lo prefiere).

JavaScript optimizado

GWT escribe JavaScript más rápido y más compacto que usted (para aplicaciones grandes), y le permite determinar qué se envía al cliente posiblemente más fácilmente que con soluciones JS completas equivalentes.

Arquitectura

Proporciona una buena separación de preocupaciones para aplicaciones grandes, con arquitecturas MVC o MVP decentes ya preparadas al alcance de su mano.

Biblioteca decente

GWT proporciona bibliotecas interesantes y facilita (bueno, más fácil) crear aplicaciones habilitadas para I18N con carga dinámica de paquetes.

Examen de la unidad

Usando JUnit desde Eclipse IDE y desde la línea de comandos. Esto se relaciona con mi primer punto. También podría utilizar algunas de las herramientas de calidad de código de Java en un proyecto GWT (para verificaciones de origen, no verificaciones de código de bytes, ya que no hay ninguna).

¡¡Es todo acerca de usted!!

GWT no es para todos. Hace que algunas personas sean más productivas y ofrece una buena herramienta para que los desarrolladores que no son JS creen aplicaciones web profesionales con front-end dinámicos sin tocar (demasiado) JavaScript. Pero si no funciona para usted, simplemente use otra cosa.

Si desea la mayor parte de lo anterior pero simplemente no desea Java, tal vez mire Google Closure o Dojo Toolkit .

Fue una buena idea en ese momento: ¡La historia importa!

El mundo de JavaScript (y las tecnologías front-end web en general) está extremadamente activo en estos días, por lo que las cosas están mejorando. Pero solo hace unos años, las cosas no eran tan brillantes. LESS / SASS no eran tan populares, jQuery todavía no era la biblioteca JS de fábrica, las bibliotecas JavaScript no se generaban cada dos semanas y las herramientas no eran tan geniales en general.

Pero, ya había una creciente demanda de aplicaciones web profesionales y grandes con front-end dinámicos, por lo que había un vacío que llenar para que los desarrolladores fueran más productivos. JavaScript tiene una gran cantidad de trampas y rarezas que debe tener en cuenta, y tal vez sea mejor no tener que preocuparse por ellas. De ahí el nicho para herramientas como GWT.

Desde entonces, han aparecido otros (CoffeeScript viene a la mente, Dart está en camino, pero también grandes marcos de JavaScript, la revolución de JS del lado del servidor con Node.JS y otros, y un fuerte regreso de JavaScript como "lo suficientemente bueno" todo lenguaje alternativo que se utilizará no solo en el lado del cliente sino también en otras partes de su negocio.


Notas adicionales

Con respecto a su pregunta original (ahora editada) sobre el uso de Firebug

Puede depurar el código GWT con Firebug, por supuesto, pero lo ideal sería depurarlo directamente desde el depurador de Eclipse IDE, que ahora proporciona soporte de depuración de código en vivo.

Sin embargo, Firebug sigue siendo utilizable, aunque debe tener en cuenta que GWT genera JavaScript optimizado y comprimido, que puede no ser fácil de depurar como está.

Con respecto a su pregunta original (ahora editada) sobre CSS

Sí, aún necesita escribir código CSS usted mismo, por supuesto. Sin embargo, combina su proyecto GWT con otras herramientas (como SASS), más o menos fácilmente.

¡Es solo una herramienta!

No confunda GWT con lo que no es: no escribe código Java para que se ejecute directamente en el lado del cliente como código de bytes Java. Escribe código en el lenguaje Java, que luego se traduce a JavaScript para mayor eficiencia y para permitirle usar un lenguaje de nivel superior (o, al menos, así es como debe verse).

Podría decirse que Java y JavaScript podrían considerarse comparables en términos de niveles de abstracción. Sin embargo, Java tiene algunas ventajas (detalladas anteriormente), de ahí la ventaja de cosechar los beneficios de las herramientas existentes sin la necesidad de volver a escribirlas. Los desarrolladores de Google tuvieron la ingeniosa idea de hacer posible reutilizar las herramientas orientadas a Java existentes, pero en efecto desarrollar aplicaciones JavaScript.

Además, resuelven otro problema, que a menudo era el engorroso manejo de las aplicaciones web de dos idiomas donde el código JavaScript y Java se trataban por separado. El uso de GWT permite un cierto nivel de convergencia para ambos lados del proceso de desarrollo.


Otras lecturas:

haylem
fuente
"Podría decirse que Java y JavaScript podrían considerarse comparables en términos de expresividad". ¿Broma? La funcionalidad equivalente en Java es aproximadamente 5 veces más larga.
Kevin Cline
@kevincline: correcto, no quise escribir expresividad, lo dije en términos de niveles de abstracción. Gracias por verlo (son las 2AM ...)
haylem
66
@kevincline: además dije "discutible", y los fanáticos acérrimos de un idioma u otro argumentarían cualquier cosa :)
haylem
1
Además de los elementos de @ Halem, agregaría que el OO basado en prototipos de JavaScript puede ser un poco extraño para alguien que viene de un sistema basado en clases como Java. La coherencia del enfoque suele ser útil.
Matthew Flynn
@MatthewFlynn: y viceversa: es por eso que los desarrolladores de JS puros definitivamente están teniendo más dificultades para subirse al carro de banda GWT, o usar marcos más pesados ​​que replican más o menos un paradigma de OO basado en clases.
haylem
6

Después de pasar años desarrollando una aplicación web en GWT, mi opinión es que GWT tiene desventajas tan serias que nunca la volvería a usar si no me veo obligado a hacerlo.

Árbol DOM

Si bien el rendimiento de JavaScript puede ser mejor, el árbol DOM representado a menudo es innecesariamente complejo. Por ejemplo, la implementación del árbol utiliza más de 13 elementos DOM, incluida una <table> para cada elemento individual. El uso de árboles grandes (alrededor de 10000 artículos) simplemente congela el navegador. Un árbol puro de JavaScript / HTML / CSS fue capaz de manejar la misma cantidad de elementos fácilmente.

Desarrollo

No se puede superar el ciclo de modificación-prueba de la fuente pura de JavaScript / HTML / CSS. Simplemente guarde su archivo fuente y actualice la página en el navegador. Este es un factor clave en la productividad y GWT simplemente no puede competir incluso utilizando el servidor de código.

La depuración de JavaScript es absolutamente fácil y placentera con el depurador de Chrome o Firebug.

Martillo Expertos

La idea de utilizar Java para todo es para desarrolladores que son "expertos en martillos". Ellos son dueños de su martillo, así que todo es un clavo. Creo que este enfoque es muy incorrecto. El uso de GWT también requiere conocimientos de CSS y HTML. Sin esto, los desarrolladores de GWT a menudo se topan con problemas que les resulta casi imposible de resolver, mientras que alguien con experiencia en HTML / CSS puede encontrar una solución. Si los desarrolladores necesitan esta competencia, pueden hacerlo más fácil con el desarrollo en HTML.

Mi opinión es que la mayoría de las ventajas proporcionadas por GWT son al menos cuestionables, mientras que las desventajas son mucho más serias en comparación con el desarrollo en JavaScript / HTML / CSS puro.

Zsolt Sky
fuente
2

No es mediblemente mejor.
Para el uso diario, considere jQuery , AmpleSDK o algún html5 polyfill .

GWT tiene muchos gastos generales: real y conceptual.

Puede ser útil si tiene una aplicación Java o algún código Java del lado del servidor para transferir a una interfaz web.

ZJR
fuente
Te refieres a ClojureScript. Clojure es un lenguaje basado en LISP dirigido a la JVM. ClojureScript es el que produce el código JS.
haylem
Sí, ya lo había editado, de todos modos. Manteniéndolo simple.
ZJR
2

Pocos beneficios de usar GWT en los que pienso (más detalles lea mi blog http://www.pandurangpatil.com/2012/09/benefits-of-using-gwt.html )

  1. Como la aplicación cliente GWT está escrita en Java, uno tiene la oportunidad de detectar errores sintácticos en el momento de la compilación debido a lo mismo (aunque no admite todas las clases JRE, ya que esas características no son compatibles con los navegadores). Tomemos un ejemplo para entender lo que estoy diciendo. Si escribe mal un nombre de variable de JavaScript utilizando la biblioteca de JavaScript puro. La única forma de detectar este error es ejecutar la aplicación y probar los resultados deseados. Las funciones de Java como Generics y Annotations se usan por completo y se pueden usar en su aplicación.

  2. Uno puede hacer uso de las bibliotecas disponibles existentes o escribir una para generar código según los requisitos con facilidad, ya que el código que debe generarse debe estar en Java. El compilador GWT se encarga de compilarlo y convertirlo a JavaScript.

  3. La gestión del código se vuelve más fácil.

  4. Simplemente se puede escribir una lógica comercial común de tal manera que se pueda usar en el código del lado del cliente GWT y también en el código del lado del servidor como en Java, por ejemplo, la validación de datos o algunas funciones de utilidad comunes.

  5. Con el uso del complemento GWT eclipse, puede depurar fácilmente el código del cliente en Java para su lógica empresarial.

  6. Como el compilador GWT compila el código Java de su cliente y genera JavaScript a partir de él. Lo que necesita implementarlo en su servidor, y se sirve y se ejecuta en el navegador del usuario cuando se solicita. Al generar este JavaScript, hará algunas optimizaciones.

    • No considera el código muerto al generar JavaScript, cuando digo código muerto quiero decir "código que está allí pero no recibe llamadas del flujo principal". A su vez, reduce el tamaño efectivo de su código JavaScript final.

    • Se encarga de ofuscar el código JavaScript generado.

    • Hace minificación del código JavaScript generado.

    • Y lo que es más importante, generará un código optimizado específico del navegador por separado. Cuando digo por separado, generará JavaScript separado específico del navegador que se servirá cuando se reciba la solicitud respectiva del navegador dado. Lo que a su vez reduce el tamaño del código JavaScript que se descarga para un navegador específico, ya que no contiene todo el manejo específico del navegador en un solo código.

  7. Si está escribiendo su solicitud para diferentes idiomas, es decir, inglés, hindi, maratí, etc., utilizando la función de internacionalización de GWT. Al generar código JavaScript, crea una copia por idioma y combinación de navegador. Lo que hace que el código JavaScript generado para una combinación dada de idioma y navegador sea el más óptimo y pequeño.

  8. En caso de que necesite utilizar JavaScript directo, que se puede llamar desde el código GWT de Java, puede hacerlo utilizando JSNI (Interfaz nativa de JavaScript). Incluso se puede volver a llamar a GWT Java Code desde JavaSctipt.

  9. Si desea crear páginas que se puedan marcar, puede utilizar la función Historial de GWT.

  10. Si desea utilizar JSON como formato de datos para la comunicación y la manipulación, tiene una característica muy buena llamada Tipos de superposición de JavaScript.

  11. La función de enlace diferido de GWT es una buena característica que supongo que es posible proporcionar debido a Java.

  12. Puede construir su interfaz de usuario utilizando widgets disponibles de GWT en estilo Java Swing. Incluso puedes crear tus widgets personalizados muy fácilmente.

  13. Si desea construir su interfaz de usuario (páginas web) en puro estilo html, puede utilizar la función de UI declarativa de GWT. Lo cual me parece una de las principales características de GWT. Lo que facilita a los desarrolladores la creación de páginas en puro estilo HTML. Lo que supongo es más fácil de mantener que la codificación de estilo Swing. Y lo más importante, aún puede tener su lógica en Java y solo la parte de presentación en HTML puro. (Nota: cualquier método que utilice (UI declarativa o estilo Swing) en última instancia, será solo HTML, pero lo que hace la diferencia es la forma en que lo codifica y lo mantiene).

  14. La función Client Bundle de GWT hace que sea muy fácil administrar sus otros recursos web como CSS, imágenes y otros contenidos de texto.

    • Los recursos CSS permiten tener lógica condicional dentro de su CSS. También puede acceder a algunos valores dinámicos desde su código Java del lado del cliente GWT.
    • También se encargará de ofuscar tus clases de CSS. Y lo más importante, GWT tiene una generación automatizada de interfaces a partir de sus archivos css para usar css classe.
    • El recurso de imagen hace que sea más fácil para el desarrollador usar imágenes en su aplicación de una manera muy fácil de mantener. Cuando digo fácilmente, quiero decir cuándo quieres usar imágenes en código GWT Java en lugar de usar una URL codificada, puedes usar recursos de imágenes. El beneficio que obtendrá al usar el recurso de imagen es que si va a cambiar la ubicación o usar alguna imagen diferente con un nombre diferente, solo necesita cambiarla en una ubicación. La característica más importante del recurso de imagen es cuando lo usa con un recurso CSS como sprite. Se encargará de hacer esa imagen como uri de datos en línea o usarla con sprite. No digo que no sea posible hacerlo con otros marcos. Lo más importante es qué tan rápido y fácil puede hacerlo. GWT te lo pone mucho más fácil.
    • Data Resource agrega algo de optimización para archivos de datos como .pdf para cambiar el nombre de esos archivos en función de su contenido para que el navegador pueda almacenarlos en caché. Los archivos de datos pequeños pueden convertirse en uri de datos en línea.
    • Al utilizar Client Bundle para otros recursos web y si estructura adecuadamente su aplicación en diferentes módulos. Puede convertirse en módulos completamente reutilizables en su conjunto con cada recurso. ¿Cuál es el problema con los módulos reutilizables? bueno si estás usando imágenes usando URL directa en algún módulo. Y si incluye ese módulo en otro módulo e intenta usar los componentes creados en ese módulo, aún necesita tener esas imágenes copiadas en la URL pública de su aplicación final. Lo cual no tiene que hacer si usa esas imágenes como recursos de imagen.
    • Otra optimización que puede lograr mediante la creación de pequeños módulos utilizando el paquete de cliente para CSS e imágenes. Donde puede elegir incluir solo los módulos requeridos dentro de su / s módulo / s final / es. La diferencia que hará es el JavaScript del módulo final y otros recursos solo contendrán los contenidos requeridos y no todo el contenido, incluso si desea utilizar una pequeña parte del módulo.
  15. Cell Widgets: para presentar la recopilación de datos paginados, GWT tiene Cell Widgets. Hay widgets como CellTable, CellList, CellTree y CellBrowser.

    • CellTable está destinado a presentar datos en formato de tabla paginada, tiene una función en la que puede cambiar el contenido de la celda dada en su lugar. Admite la paginación en el lado del cliente y del servidor, admite la clasificación en columna y también admite la selección de uno o varios registros y la generación de eventos para el mismo.
    • CellList se puede usar para presentar datos en formato de lista y los elementos se pueden mostrar en formato personalizado. También admite la paginación del lado del cliente y del servidor y la selección de uno o varios registros y genera eventos para la selección. CellTree y CellBrowser se pueden usar para presentar datos en formato de árbol.
  16. Comunicación con el servidor desde el código del cliente GWT. Admite múltiples formas de implementar la comunicación del servidor del cliente.

    • Si no le preocupa el protocolo que se utiliza para la transferencia de datos, entonces es el mecanismo GWT RPC. Es muy fácil integrar su código del lado del cliente para la transferencia de datos con el servidor. Puede definir DTO personalizados (objeto de transferencia de datos) en el código del cliente que incluso se puede usar en el código del lado del servidor. La implementación del lado del servidor acepta los mismos DTO como parámetro o valor de retorno. Todo lo demás está a cargo del marco de trabajo GWT RPC. Incluso propaga las excepciones generadas desde el código del lado del servidor a la persona que llama en el código del lado del cliente (siempre que necesite definir esas clases de excepción dentro del paquete de código del lado del cliente. GWT RPC utiliza internamente llamadas AJAX con su propio protocolo personalizado para la transferencia de datos.

    • Si no desea utilizar GWT RPC, puede hacer llamadas AJAX al servidor para obtener datos del servidor utilizando Request Builder. Lo cual también es mucho más fácil de implementar. También tiene una característica interesante Request Factory. Con esta función, puede exponer su DAO o capa de servicio para que lo llamen desde el código del cliente. Para ello, necesita definir pocos conjuntos de interfaces para su servicio y tipos de datos personalizados. Y utilizando estas interfaces puede acceder a esos servicios desde el código del cliente. He escrito el complemento Maven para generar estas interfaces. Si anota su capa DAO con algunas anotaciones requeridas, consulte ( https://github.com/pandurangpatil/gwt-mvn-helper) consulte el módulo mvn-helper-test dentro de él para su uso. Request Factory está más dirigido a integrarse con la capa ORM como JDO o JPA en el servidor. Tiene un soporte para llamar a persistir en una determinada entidad desde el código del cliente. Y lo más importante cuando llama al método de persistencia, calcula y envía solo el cambio (delta) al servidor para guardar.

    • Si desea realizar una llamada JSONP entre dominios, puede hacer lo mismo.

Pandurang Patil
fuente