Introduccion al Stack Go + Templ + HTMX

Por: Artiko
gotemplhtmxintroduccion

Introduccion al Stack Go + Templ + HTMX

El problema: fatiga de JavaScript

El desarrollo web moderno se ha vuelto complejo. Para construir una aplicacion “simple” necesitas:

Para muchas aplicaciones esto es excesivo. No todo necesita ser una SPA con hidratacion parcial y server components.

La alternativa: HTML sobre HTTP

El stack Go + Templ + HTMX propone una arquitectura mas simple:

  1. El servidor (Go) procesa la logica y devuelve HTML
  2. Los templates (Templ) generan ese HTML de forma tipada y composable
  3. El cliente (HTMX) agrega interactividad intercambiando fragmentos de HTML con el servidor

No hay JSON APIs, no hay serializacion/deserializacion, no hay estado duplicado entre cliente y servidor.

Go: el backend

Go es un lenguaje compilado creado por Google que destaca por:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "<h1>Hola mundo</h1>")
})
http.ListenAndServe(":3000", nil)

Con 4 lineas tienes un servidor HTTP funcional.

Templ: templates tipados

Templ es un lenguaje de templates para Go que se compila a codigo Go nativo. A diferencia de html/template de la stdlib:

// saludo.templ
templ Saludo(nombre string) {
    <div class="saludo">
        <h1>Hola, { nombre }</h1>
        <p>Bienvenido a la aplicacion</p>
    </div>
}

Esto genera una funcion Go que puedes llamar desde tu handler:

func handleSaludo(w http.ResponseWriter, r *http.Request) {
    componente := Saludo("Artiko")
    componente.Render(r.Context(), w)
}

HTMX: interactividad sin JavaScript

HTMX permite que cualquier elemento HTML haga peticiones HTTP y actualice el DOM. Se usa con atributos HTML:

<button hx-get="/api/tareas" hx-target="#lista" hx-swap="innerHTML">
    Cargar tareas
</button>
<div id="lista">
    <!-- aqui aparecen las tareas -->
</div>

Al hacer clic, HTMX:

  1. Hace un GET a /api/tareas
  2. Recibe HTML del servidor
  3. Reemplaza el contenido de #lista con la respuesta

No escribiste JavaScript. El servidor devuelve HTML renderizado, no JSON.

Comparativa con otros stacks

AspectoGo+Templ+HTMXReact/Next.jsGo+html/templateLaravel/Rails
Lenguaje servidorGoJavaScript/TSGoPHP/Ruby
Templates tipadosSi (Templ)Si (JSX/TSX)NoNo
JavaScript necesarioMinimo (HTMX)MuchoManualjQuery/Turbo
Binario finalSiNo (Node)SiNo
DependenciasPocasCientosPocasMuchas
Curva de aprendizajeMediaAltaMediaMedia
InteractividadFragmentos HTMLVirtual DOMManualTurbo/Livewire

Que vamos a construir

A lo largo de este tutorial construiremos una Todo List completa con:

Todo esto con un binario Go unico que puedes desplegar en cualquier servidor o contenedor Docker.

Prerequisitos

Si sabes programar en cualquier lenguaje, puedes seguir este tutorial. Los conceptos de Go se explican en el siguiente capitulo.