Hotwire: tecnología HTML over the wire
(hotwired.dev)- Hotwire es un enfoque para crear aplicaciones web modernas enviando HTML en lugar de JSON, con el objetivo de lograr una primera carga rápida y buena capacidad de respuesta sin mucho JavaScript
- Como deja el renderizado en plantillas del servidor, puede mantener un flujo de desarrollo simple sin importar el lenguaje que se use
- Los frameworks que 37signals creó para HEY se combinan entre sí para formar el ecosistema Hotwire, que abarca desde la web hasta múltiples plataformas
- Turbo, el componente central, maneja transiciones de página, envío de formularios, división en componentes y actualizaciones parciales basadas en WebSocket sin escribir JavaScript
- Stimulus complementa las interacciones personalizadas que no cubre Turbo, y Hotwire Native permite crear apps móviles nativas a partir de una aplicación web existente
Un enfoque de enviar HTML renderizado desde el servidor
- Hotwire es un enfoque alternativo para construir aplicaciones web modernas mediante HTML-over-the-wire
- En lugar de JSON, envía HTML por la red, lo que permite crear aplicaciones sin depender de mucho JavaScript
- Busca una primera carga de página rápida, mantener el renderizado con plantillas del lado del servidor y ofrecer una experiencia de desarrollo más simple y productiva
- La idea es no renunciar a la velocidad ni a la capacidad de respuesta que normalmente se esperan de una aplicación tradicional de una sola página
- HTML-over-the-wire también puede usarse como referencia para crear tus propias herramientas, o se pueden usar tal cual los frameworks Hotwire que 37signals creó para HEY
El papel de Turbo, Stimulus y Hotwire Native
- Turbo es el componente central de Hotwire
- Ofrece técnicas complementarias para manejar con rapidez las transiciones de página y el envío de formularios
- Divide páginas complejas en componentes y transmite actualizaciones parciales de la página mediante WebSocket
- Proporciona estas funciones sin necesidad de escribir JavaScript
- Stimulus se usa cuando hace falta código personalizado que Turbo por sí solo no cubre
- Turbo normalmente resuelve al menos el 80% de las interacciones que tradicionalmente requerían JavaScript
- Stimulus permite manejar estado y conexiones con un enfoque centrado en HTML
- Hotwire Native es un framework web-first para crear aplicaciones móviles nativas
- Proporciona las herramientas necesarias para crear apps móviles aprovechando una aplicación web existente
1 comentarios
Opiniones en Hacker News
Existe una versión menos marketineada de esta función llamada htmx: https://htmx.org/
Permite hacer este tipo de cosas con un solo archivo JavaScript, y aunque lo he visto usarse sobre todo con backends en Go, parece bastante flexible. Hace más o menos un año que vengo pensando en probarlo.
Solo en el último año hubo cientos de envíos en HN 0, e incluso hubo publicaciones que superaron los 1000 puntos. En cambio, Hotwire tuvo menos de 30 envíos en el último año 1, y el más popular de ellos es este artículo.
Con solo mirar un rato YouTube, los influencers de programación no paran de promover htmx con miniaturas de sus caras.
También es muy activo en Twitter, aparece con frecuencia en el canal de YouTube de The Primeagen y es bastante popular.
Si buscas algo parecido en PHP/Laravel, recomiendo mucho Livewire: https://laravel-livewire.com/
Para proyectos más complejos sigo usando React, pero siempre resulta refrescante poder escribir todo en Blade/PHP y aun así mantener elementos de UI reactivos. Recuerdo haber visto también un paquete que permite renderizar componentes de React/Vue dentro de Livewire cuando hace falta: https://minglejs.unitedbycode.com/. Parece una vía de escape interesante cuando necesitas incorporar paquetes existentes.
Antes era bastante negativo con Hotwire/Livewire, pero ahora los veo como herramientas adecuadas según el contexto.
Enviar plantillas parciales por el cable es un enfoque de hipermedia; simplemente hoy en día no solemos crear bien aplicaciones de hipermedia. Llegué hasta acá tras volver a leer htmx y el paper de REST de RTF, y aunque no creo que la hipermedia sea una arquitectura inherentemente superior, sí me parece una opción legítima entre varias, y es bueno que siga evolucionando aunque sea lentamente.
Es probablemente una de las formas más fáciles de crear una PWA sin meterse en la madriguera de React/Vue/Svelte.
También las he usado y me parecen excelentes, pero comparadas con htmx se sienten más centradas en la experiencia del desarrollador que en la tecnología. La competencia entre ambas probablemente terminará dependiendo de con qué framework de backend se integre mejor cada una.
Personalmente, creo que una PWA es un problema del cliente y debería resolverse del lado del cliente, sin agregar dependencias del servidor.
Acá está la conversación de HN de 2020, más cercana al momento en que esto salió por primera vez: https://news.ycombinator.com/item?id=25507942
Como artículos relacionados están Why Hotwire Could be the Future of Front-end Dev - https://news.ycombinator.com/item?id=26195969 - febrero de 2021, 6 comentarios / Hotwire: A new old way to build web apps - https://news.ycombinator.com/item?id=25942864 - enero de 2021, 56 comentarios.
Se siente como si hubiéramos dado casi toda la vuelta. Recuerdo que por 2005 o 2006 interceptábamos los clics, agregábamos parámetros, recibíamos solo fragmentos parciales de HTML renderizado y reemplazábamos el cuerpo con
.innerHTMLEl truco era mantener abierta la solicitud HTTP y que el servidor enviara actualizaciones de vez en cuando; esas actualizaciones también eran HTML. En esa época quizá ni siquiera se podía manipular el DOM, así que tal vez literalmente era una página con una etiqueta que nunca se cerraba
Los frameworks de renderizado en servidor están facilitando las interacciones del cliente, y React, mediante RSC, está facilitando el renderizado en servidor. Si es una web app con mucha interacción, una SPA sigue teniendo ventaja
Aunque hay muchísimos proyectos SPA, eso no describe todos los sitios web del mundo
La paginación se implementó así: al desplazarse hacia abajo y presionar “Show more”, se solicita al servidor la siguiente página como fragmento HTML, se carga en un iframe invisible y, cuando termina de cargar, se adjunta a la página actual
Considerando cuánto han mejorado la web, JavaScript y TypeScript desde entonces, me cuesta entusiasmarme de nuevo con este enfoque
No he trabajado mucho con web apps que necesiten frontends altamente interactivos, pero en tiendas de e-commerce y apps internas en Rails, Turbo y Stimulus redujeron mucho lo que un desarrollador nuevo tenía que aprender
Por ejemplo, en un proyecto Django armamos rápidamente toda una herramienta de oficina con el ya probado KnockoutJS, y eso también conecta en cierta medida con el espíritu de HTMX. Arrow.JS, que todavía está en una etapa temprana, es parecido. La complejidad, especialmente la de la UI, por lo general fue autoinfligida; las formas antiguas no están para nada obsoletas y, de hecho, están volviendo. Hay una generación de desarrolladores jóvenes que entró en la industria en la época más tonta, cuando se los convencía de que toda aplicación web tenía que convertirse en un bulto excesivamente complejo e insoportable
Uso Hey de pago desde su lanzamiento, y si la experiencia de la web app de Hey es el mejor ejemplo de Hotwire, prefiero pasar
En conexiones lentas es mala. Puede ser porque los desarrolladores no agregaron estados de carga o de error, puede ser por la alta complejidad, o puede ser un bug de Hey. No sé, pero no está bien
Con latencias medias a altas, el comportamiento se siente impredecible o como si tuviera bugs. Se abren cajas sin contenido, los enlaces no funcionan como se espera, y cuando haces varias acciones rápidamente una tras otra no se interrumpen de manera intuitiva. Simplemente se siente desalineado
Por más malas que sean las SPA, esto parece un paso en dirección contraria a que la UI se sienta nativa y natural
La razón por la que este artículo volvió a aparecer ahora es que la semana pasada alguien publicó que Hey era lento abriendo un modal: https://x.com/noahflk/status/1795758603577545035
Hey lo hizo DHH, y DHH también creó Hotwire y Rails. Después de eso, se mezclaron la respuesta de DHH diciendo que el video original fue grabado en una red limitada, reacciones de que si cargar un modal tarda entonces Hotwire depende demasiado de la red, defensas de Rails/Hotwire y críticas al enfoque, y se volvió una discusión acalorada. Fue un tema grande en Twitter la semana pasada
El autor también escribió que “lo hizo lento intencionalmente para la demostración”: https://x.com/noahflk/status/1795855075526471915. Dijo que no quería mostrar la experiencia de alguien con “una buena MacBook e internet gigabit en SF”, sino referirse a alguien con internet móvil lento y una laptop barata. También se señaló que la SPA de Google Calendar es mucho más lenta, y tampoco es que las únicas opciones sean “internet gigabit en SF” y “3G fuertemente limitado”. La publicación original era muy engañosa y, en la práctica, casi una mentira
La estructura de la página era especialmente impresionante. Por ejemplo, aplicaba una combinación de
details/summary/anchora los overlays de menú contextual con mejora progresiva, y aunque se desactivara JavaScript o no cargaran los assets, el contenido del menú se cargaba elegantemente con un layout simple. Recuerdo que también había muchas otras partes donde usaban Web API con cuidado, y que el código del cliente casi no estaba ofuscado y traía source maps. No soy fan de DHH ni pienso seguir el drama de esa semana, pero esta vez sentí que 37signals lo hizo bienHace 2 años hice Swap JS, una implementación más minimalista de la misma idea: https://github.com/josephernest/Swap
Lo probé en algunos proyectos y funciona bien