Los SSG modernos como Astro o Eleventy son excelentes, pero muchas veces traen mas de lo que necesitas. Mi objetivo era simple: convertir una base de datos JSON en HTML estatico, sin webpack, sin bundlers, sin 200MB de node_modules.

Editor de codigo con tema oscuro

El motor de templates

En lugar de usar un motor de templates completo como Handlebars o EJS, escribi un renderizador de 10 lineas que entiende {{variables}} y bloques {{#array}}...{{/array}}.

function render(template, data) {
  return template
    .replace(/\{\{#(\w+)\}\}([\s\S]*?)\{\{/\1\}\}/g, (m,k,inner) =>
      (data[k]||[]).map(i => render(inner, {...data,...i})).join(""))
    .replace(/\{\{(\w+)\}\}/g, (m,k) => data[k] ?? m);
}

Eso es todo. 3 lineas de regex y recursividad. Genera HTML, RSS, sitemaps y JSON API desde los mismos templates.

Rendimiento del build

EtapaTiempoArchivos generados
Lectura DB5ms3 colecciones
Render posts12ms2 HTML
Render taxonomias8ms5 HTML
RSS + Sitemap3ms7 XML
Copia assets10ms2 archivos
Total~40ms19 archivos

El build completo de un blog con 2 posts, 4 taxonomias, RSS, sitemap y busqueda indexada toma menos de 50ms en un MacBook Air M2.

Comparado con Astro (que tarda 3-5 segundos en el mismo hardware), la diferencia es abismal. Claro, Astro hace mucho mas (hydration, bundling, etc.), pero para un blog estatico puro, es overkill.