HTMX y Alpine.js están cambiando la forma de construir interfaces web. Ambos se enfocan en extender HTML con capacidades modernas sin necesidad de un sistema de compilación. ¿Lo mejor? ¡Puedes usarlos juntos!
HTMX te permite hacer llamadas tipo Ajax y actualizar vistas desde el backend usando solo atributos HTML (hx-get, hx-target, etc.).
Alpine.js, por su parte, agrega reactividad y manejo de estado en el cliente, todo también desde atributos HTML (x-data, x-for, x-show, etc.).
Ambos usan atributos embebidos para mejorar el HTML, lo que significa menos archivos, menos complejidad y más productividad.
Una crítica común es que “mezclan lógica con presentación”. Aunque esto puede ser un problema en apps grandes, en proyectos pequeños o medianos, el enfoque tiene sentido.
HTMX extiende HTML y Alpine inyecta JavaScript donde lo necesitas. Lo importante es: ¿te sirve para tu proyecto?
Combinar HTMX y Alpine es natural. HTMX puede encargarse de la carga de datos desde el backend, mientras Alpine maneja interacciones del usuario y estados del lado cliente.
Ejemplo: carga una lista de productos con HTMX y permite filtrarlos dinámicamente con Alpine.
El estado vive en el servidor. Ejemplo:
<div>
<ul id="album-list"></ul>
<button hx-get="/albums" hx-target="#album-list">Cargar Álbumes</button>
</div>
El servidor responde con HTML renderizado y HTMX lo inserta en el DOM. ✅
El estado vive en el cliente. Ejemplo:
<div x-data="{ albums: [], fetchAlbums() {
fetch('/albums')
.then(res => res.json())
.then(data => this.albums = data)
}}">
<ul>
<template x-for="album in albums" :key="album.id">
<li x-text="album.name"></li>
</template>
</ul>
<button @click="fetchAlbums()">Cargar Álbumes</button>
</div>
Aquí, el estado es local y se manipula con JavaScript embebido.
<div x-data="{
selectedProduct: null,
showDetails: false,
selectProduct(event) {
this.selectedProduct = event.target.innerHTML;
this.showDetails = true;
}
}" @click="selectProduct">
<div id="product-list"></div>
<div class="product" x-show="showDetails">
<p x-text="selectedProduct"></p>
</div>
<select hx-get="/products" name="category" hx-target="#product-list">
<option value="all">Todos</option>
<option value="electronics">Electrónica</option>
<option value="clothing">Ropa</option>
</select>
</div>
Aquí usamos HTMX para cargar productos por categoría y Alpine para mostrar detalles al hacer clic, todo sin perder simplicidad.
La extensión Alpine Morph permite reemplazar componentes sin perder el estado de Alpine, ideal al usarlos con HTMX.
HTMX puede trabajar con JSON usando extensiones, pero si ya estás usando Alpine, puedes usar su sistema fetch() directamente para APIs que devuelven JSON. ¡Tienes lo mejor de ambos mundos!
HTMX y Alpine tienen una excelente relación peso/capacidad. Son herramientas pequeñas con un gran impacto:
¿Quieres construir rápido, con flexibilidad y sin complicarte con React o Vue? HTMX + Alpine puede ser tu stack ideal.
La biografía más vendida del cofundador de Apple, Steve Jobs; escrita por uno de los…
Hubo un tiempo en el que la “seguridad en el hogar” significaba confiar en un…
Elon Musk vuelve a romper todos los esquemas. Los accionistas de Tesla acaban de aprobar…
Los fans de Grand Theft Auto tendrán que esperar un poco más para volver a…
Five Nights at Freddy’s: Into the Pit nos sumerge en un misterioso mundo donde lo…
Adéntrate en el oscuro y retorcido mundo de Bendy and the Ink Machine, donde los…