- htmx 4.0 es una gran reconstrucción que reemplaza por completo la arquitectura existente basada en
XMLHttpRequest por una estructura asíncrona centrada en fetch()
- El método de herencia de atributos cambia de implícito a una declaración explícita con
:inherited, mejorando la claridad del código y su mantenibilidad
- La caché de historial se simplifica: en lugar de guardar snapshots locales, ahora usa una restauración basada en solicitudes de red, lo que refuerza la estabilidad
- Varias funciones nuevas como respuestas en streaming, SSE, DOM morphing, la etiqueta
<partial> y la cola de View Transition se integran al core
- A largo plazo, apunta a una simplificación del código base y una mejor extensibilidad, y también se seguirá dando soporte a los usuarios de 2.0
Resumen de htmx 4.0
- htmx 4.0 reescribe por completo la estructura existente e incorpora la experiencia de desarrollo de fixi.js y cinco años de lecciones de mantenimiento
- Los cambios principales se resumen en tres puntos clave: migración a
fetch(), explicitación de la herencia de atributos y simplificación de la caché de historial
The fetch()ening
- Se reemplaza
XMLHttpRequest por fetch() para modernizar la infraestructura Ajax
- En la mayoría de los casos de uso no habrá un gran impacto, pero el modelo de eventos cambia según la naturaleza asíncrona de
fetch()
- Esta transición sienta la base para simplificar el código y ampliar funciones a futuro
Herencia explícita de atributos
- En lugar de la herencia implícita anterior, ahora se declara explícitamente con el modificador
:inherited
- Para la mayoría de los usuarios, este será el cambio de actualización más importante
Simplificación de la caché de historial
- La caché local de snapshots del DOM de htmx 2.0 era inestable por modificaciones de terceros, estados ocultos y otros factores
- En 4.0 cambia a un método de restauración mediante solicitudes de red
- La ampliación de caché se ofrecerá como opción de activación voluntaria (opt-in)
- Esto simplifica el código base y mejora la confiabilidad del comportamiento predeterminado
Elementos que se mantienen
- La API principal sigue igual:
hx-get, hx-post, hx-target, hx-boost, hx-swap, hx-trigger, etc.
- Salvo por la adición de
:inherited, la mayoría de los proyectos podrán seguir funcionando con su código actual
- Se refuerzan la mantenibilidad a largo plazo y la estabilidad
Política de actualización
- Los usuarios de 2.0 necesitarán un proyecto de actualización, pero 2.0 tendrá soporte permanente
- 4.0 se distribuirá en paralelo con 2.x, y se espera el cambio a
latest a inicios de 2027
- Está prevista una extensión para restaurar el comportamiento de 2.0
Resumen de funciones nuevas
Integración de respuestas en streaming y SSE
- Aprovecha el soporte de Readable Streams de
fetch() para permitir reemplazos parciales del DOM
- SSE (Server Sent Events) se reintegra como función central, permitiendo actualizaciones progresivas de contenido
Morphing Swap
- Basado en el algoritmo Idiomorph, mejora la decisión de conservar o eliminar nodos al fusionar el DOM
- Los swaps
morphInner y morphOuter se incluyen en el core
Soporte para la etiqueta <partial>
- Simplifica la sintaxis compleja del Out-of-band swap existente
<partial> es un elemento de plantilla que puede usar atributos estándar como hx-target, hx-swap, etc.
- El Out-of-band swap vuelve a un reemplazo simple basado en id
Mejoras en View Transition
- Se introduce una cola de transiciones (queue) para evitar conflictos visuales
- Las transiciones CSS mantienen el enfoque actual, pero se simplifican con un runtime asíncrono
- Aún no está definido si se activará por defecto
Estabilización del orden de eventos
- La estructura asíncrona basada en
fetch() facilita garantizar el orden de los eventos
- Se introduce una nueva convención de nombres para eventos:
htmx:<phase>:<system>[:<optional-sub-action>]
- Ejemplo:
htmx:before:request
Mayor extensibilidad
- Gracias a
async, se ofrecen extensiones para solicitudes anticipadas (preload) y actualizaciones optimistas (optimistic update)
- El ciclo de solicitud/respuesta/swap queda abierto a los desarrolladores de extensiones, incluso permitiendo reemplazar la implementación de
fetch()
- Será posible implementar el comportamiento deseado sin hacks
Mejoras en hx-on
Dirección general
- htmx 4.0 busca mantener una experiencia de uso similar a la de 2.0 mientras apunta a menos bugs y mejores funciones
- Con simplificación del código, estructura explícita y extensibilidad basada en asincronía, ofrece un htmx más estable y moderno
Calendario de desarrollo
- La versión alfa (
htmx@4.0.0-alpha1) ya está disponible
- El lanzamiento oficial de 4.0.0 está previsto para inicios o mediados de 2026
- El cambio a
latest está previsto a inicios de 2027
- El progreso del desarrollo puede revisarse en la rama
four de GitHub y en four.htmx.org
1 comentarios
Opiniones en Hacker News
Al final cambió de opinión y va a lanzar una nueva versión mayor de htmx
Pero, para cumplir la promesa de que “no habrá 3.0”, la próxima versión se llamará htmx 4.0
Bromea con que, técnicamente, esa forma de decirlo es correcta
Quizás habría sido mejor simplemente llamarla 3.0
htmx 2.0 tendrá soporte permanente, así que no habrá ninguna presión por actualizar
En una época como la actual, donde los cambios de API son frecuentes, este enfoque merece reconocimiento
Sienten que quienes priorizan la estabilidad a veces sacan la lección equivocada
En lugar de meter cambios grandes de golpe, como con Python 3.0, sostienen que es mejor una estrategia de lanzamientos graduales
Por ejemplo, introducir cambios repartidos entre 2.1, 4.0, 5.0, etc., hace todo mucho más manejable
Recomiendan un enfoque como el de Django, manteniendo etapas de compatibilidad a lo largo de varias versiones
Les parece confusa la descripción del atributo
hx-target“inherited” suena menos natural que “inheritable” o “inherit”
En broma, agrega que también podría ser “bequeath”
Les gustan la idea de HTMX y la filosofía de Hypermedia
Pero, al salir del mundo SPA, eligieron Datastar porque sienten que ofrece más escalabilidad por la inversión de aprendizaje
Empujaron señales directamente del servidor al navegador y eliminaron el código de polling, reduciendo mucho la complejidad
También quitaron la dependencia de Alpine.js, lo que simplificó el código, y las actualizaciones completas de vista basadas en streaming funcionan eficientemente gracias a la compresión
Si vienes de un entorno SPA, recomiendan probar tanto Datastar como HTMX
Les parece interesante el cambio a
fetch()para aprovechar Readable StreamHan usado mucho HTMX, pero últimamente prefieren Datastar por su streaming basado en SSE
Aunque celebran la evolución de HTMX, sienten que Datastar ofrece una API más alineada con los estándares y más flexible
Dicen que en un paquete pequeño incluye Fetch, SSE, señales declarativas, DOM morphing y varias funciones más
Por eso plantean la pregunta: “¿por qué usar HTMX?”
Datastar está más centrado en flujos de eventos, así que encaja bien para dashboards en tiempo real o juegos, pero para la mayoría de las web apps la simplicidad de HTMX resulta más ventajosa
Referencias relacionadas: ensayo de Datastar, Less HTMX is More
Cuestionan que, después de decir que era “tan perfecto que ya no habría más versiones mayores”, ahora hayan reconocido la necesidad de evolucionar
Citan la parte de “ahora vamos a cambiar el estándar de nombres de eventos”, con tono de sátira hacia el intento de evitar JavaScript
Aun así, reconocen que poder expresar la intención en HTML tiene valor
Dicen que el texto es muy claro y que permitió aprender bastante sobre la filosofía de diseño de APIs
Crearon xhr-fetch-proxy para usar
fetchjunto con HTMX,y creen que este cambio abrirá todavía más posibilidades
Enlace del proyecto
Agregan que aprendieron esa idea de fixi.js