Crear un sitio web sin frameworks ni varias bibliotecas
(kodingkitty.com)- Koding Kitty aplicó un stack centrado en HTML estático para el sitio web de una pequeña empresa, y opera las páginas necesarias y un blog sin un gran CMS ni frameworks
- Los criterios de elección fueron velocidad, facilidad de desarrollo, hosting barato y baja complejidad; WordPress, no-code, frameworks y Jamstack implicaban demasiada configuración y carga de aprendizaje para sus requisitos
- El contenido se escribe directamente en HTML en lugar de Markdown o un editor visual, lo que facilita manejar publicaciones que combinan texto y widgets HTML/CSS/JS
- Las estructuras repetidas y los bloques comunes se manejan con plantillas Jinja, y un script de Python de 45 líneas encadena la detección de cambios, el renderizado de HTML y la llamada a Tailwind CSS CLI
- Al ser un sitio estático, basta con hosting barato; el web hosting de Hetzner empieza desde 2 EUR y soportó picos de tráfico de la portada de Hacker News
Por qué eligieron un stack simple
- El stack tecnológico del sitio web de Koding Kitty no sigue tanto la moda reciente del desarrollo web ligero, sino que está configurado deliberadamente de forma simple según sus necesidades reales
- El objetivo era una configuración con poca fricción para el desarrollador, y consideraron que una solución simple podía ser mejor para los clientes que una combinación compleja de frameworks y bibliotecas
- Un diseño distintivo pero no exagerado podía construirse de varias maneras, pero la configuración actual es una elección ajustada al alcance necesario
Requisitos y criterios iniciales
- Desde el principio decidieron crear un sitio web estático
- Las funciones necesarias eran básicamente una página principal, una vitrina y un blog, y no mucho más
- Los criterios eran cuatro
- Sitio web rápido
- Desarrollo rápido
- Hosting barato
- Complejidad mínima
Opciones evaluadas pero descartadas
-
WordPress y CMS similares
- Reconocen que WordPress ha tenido un papel importante en Internet
- Pero era excesivo para unos requisitos modestos
- No necesitaban guardar el contenido en una base de datos, ni plugins ni un editor visual
-
Herramientas no-code
- Les pareció extraño que un codificador web usara herramientas no-code
- Querían ser dueños directos del contenido y manejar el sitio web como quisieran
- Consideraron que hacerlo con código era más rápido que con un editor WYSIWYG no-code
- La necesidad de aprendizaje inicial y continuo también era una carga
-
Frameworks
- Tenían experiencia con frameworks, pero no querían traer toda la configuración
- Podrían acumularse demasiados componentes, como base de datos, configuración, bibliotecas y funciones de administración
- Aunque se puede personalizar por completo, concluyeron que el resultado podría terminar pareciéndose a WordPress
-
Jamstack y generadores de sitios estáticos
- Los generadores de sitios estáticos parecían una opción que encajaba bien con los requisitos
- Permiten elegir un lenguaje, programar y luego crear rápidamente un sitio estático con un botón o script
- Sin embargo, requerían configuración inicial y aprendizaje inicial y continuo
- Reconocieron la comodidad de escribir un blog en Markdown, pero en conjunto eligieron una solución más simple
Composición de KittyStack
- La configuración de Koding Kitty se organizó en torno a los cuatro requisitos
-
Sitio web rápido
- Un sitio web estático funciona rápido
-
Desarrollo rápido
- El contenido se escribe en HTML, no en Markdown ni con editores avanzados
- Como las publicaciones de Koding Kitty mezclan texto y widgets HTML/CSS/JS, escribir HTML directamente era lo adecuado
-
Hosting barato
- El costo del hosting para sitios estáticos varía según el proveedor y las funciones adicionales necesarias
- Como los sitios estáticos no requieren una gran configuración de hardware, se puede elegir una configuración mínima
- Hetzner webhosting empieza desde 2 EUR
- El sitio de Koding Kitty soportó incluso picos de tráfico del nivel de aparecer en la portada de Hacker News
-
Complejidad mínima
- Algunas páginas y publicaciones tienen patrones repetidos
- Sería posible hacerlo copiando y pegando, pero con el tiempo podría volverse difícil de controlar
- Necesitaban bucles e inclusión de bloques de código como headers y footers
Jinja y flujo de build
- Las estructuras repetidas y la inclusión de archivos comunes se manejan con plantillas Jinja
- Jinja ofrece bucles, inclusión de archivos como la barra de navegación y el footer, y otras funciones de plantillas
- El equipo ya había usado frameworks basados en Jinja en el pasado, así que no tuvo que aprender un sistema nuevo
Cadena de herramientas simple
- Las páginas estáticas finales se generan con un script de Python de 45 líneas
- El conteo de líneas incluye comentarios y líneas en blanco
- El flujo de build es el siguiente
- El desarrollador modifica
index.src.html Watchdog.pydetecta cambios en los archivos- Renderiza la plantilla Jinja como
index.html - Llama a Tailwind CSS CLI para generar
styles.min.css
- El desarrollador modifica
- Durante el desarrollo, Live Server sirve los archivos y recarga cuando hay cambios
- Al momento de desplegar, los archivos se suben manualmente por FTP
Ventajas de un desarrollo web menos complejo
- El desarrollo web puede mantenerse simple sin sacrificar muchas cosas
- Limitar las opciones a unas pocas puede, de hecho, sentirse más libre
- Para muchos clientes, una solución más rápida, más simple y más barata puede ser útil
- Conviene observar el panorama web en general y evaluar si se puede lograr el mismo resultado con un stack tecnológico menos complejo
1 comentarios
Comentarios en Hacker News
Un portafolio de fotografía también terminó asentándose con el mismo enfoque. Como pasé de desarrollo a fotografía, una ventaja es que no tengo que depender de Squarespace como otros fotógrafos
Después de probar varias opciones basadas en servidor hechas con Ghost, Statamic y Phoenix/Vapor, además de los generadores de sitios estáticos habituales, al final terminé escribiendo HTML puro sin plantillas y subiéndolo a un servidor de Hetzner con rsync
Que no haya plantillas para UI compartida como la navegación sí molesta un poco, pero todavía no ha habido cambios que me tomen más de unos minutos con expresiones regulares, y una vez al principio un regex codicioso borró contenido, pero git me salvó
Generar variantes de imágenes por tamaño y formato es fastidioso, pero me permite probar nuevos layouts sin depender de estructuras rígidas como la de Ghost. Además, al exportar imágenes para web, el editor RAW Capture One me pareció dar una calidad ligeramente mejor que las librerías o herramientas CLI que usan la mayoría de los generadores de sitios estáticos
Es más lento, pero lo veo más cercano a hacer un fotolibro. Al principio requiere más trabajo manual, pero una vez que queda terminado, queda terminado, y no hace falta ir saltando entre distintos CMS durante los próximos 20 años y romperlo todo
En la práctica, es una estructura de unos cuantos archivos HTML potenciados por plantillas; usa la API de Flickr para traer fotos desde un álbum exclusivo para este sitio, y Netlify despliega automáticamente con solo hacer
git pushEl costo total, incluyendo hosting, es de 0 dólares, y con la app de Flickr puedo administrar fotos desde el celular. También me gusta que con Netlify no hace falta tocar un servidor real
Lo que usé hace poco también podría servir(https://news.ycombinator.com/item?id=36592641). Usar Google Sheet como fuente de datos fue fácil, y seguramente habría sido igual cambiándolo por un sistema de archivos de fotos
Esto no parece “simple”, sino más bien simplista. Puedes hacer un sitio web relativamente simple si no haces nada y vas recortando las esquinas
Basta con ver el modo oscuro, que es casi la única función no trivial visible en esta página: está hecho con JS cargado de forma diferida, así que en cada carga de página hay un parpadeo blanco inevitable. Para hacerlo bien tendría que ser con clases CSS en el body, y una solución que no funciona no sirve ni si es simple ni si es compleja
Además, traer un intérprete personalizado entero de ‘hyperscript’ como https://hyperscript.org/ solo para 3 líneas de JS de
localStoragey la configuración del modo oscuro va en contra de la idea de que “la simplicidad es la máxima sofisticación”. Cargar una librería sin caché de 96 KB únicamente para eso es raro, y me pregunto si por eso tampoco valida el HTMLPor último, un toggle binario es una mala implementación de modo oscuro porque ignora la configuración del sistema/navegador. Aunque actives el modo oscuro en el sistema operativo del teléfono, seguirá mostrando modo claro hasta que el usuario lo active manualmente, y tampoco respeta configuraciones del sistema que cambian según la hora o la luz ambiental.
localStoragepuede expirar y además uno cambia de dispositivo, así que hay que configurarlo una y otra vez; probablemente los usuarios no estén de acuerdo con lo que el desarrollador llama una implementación ‘simple’Si empiezas a considerar cosas como configuración del sistema/navegador, cambios por zona horaria o por luz ambiental, la complejidad choca demasiado con la filosofía de un sitio simple. Mejor quitar el modo oscuro; incluso HN está siempre en modo claro y no hay gran problema para leerlo de noche
Normalmente quieres respetar
prefers-color-schemey al mismo tiempo ofrecer un toggle, y si el usuario ya eligió manualmente una opción antes en el sitio, quieres priorizar esa elección. Entonces igual necesitas JS ylocalStorageMi forma preferida es poner un estilo inline con
body {visibility: hidden; opacity: 0;}. Puedes mantener visible la página anterior y, cuando llegueDOMContentLoaded, revisarprefers-color-schemeylocalStorage, asignar la clase correcta al body y recién entonces renderizar la páginaMi sitio respeta los temas claro/oscuro con CSS y no tiene toggle manual. Tengo como meta personal un sitio puro HTML/CSS sin JS, y creo que la configuración de claro/oscuro debe respetar la preferencia del usuario. Si hace falta un toggle, debería estar no dentro del sitio sino en la barra de herramientas del navegador
Si /u/gwern llega a leer esto, mi sitio https://daveon.design/ recibió influencia del diseño de gwern y de Tufte.css. También mezcla publicaciones antiguas, manuscritos y gustos personales, pero gwern fue el ejemplo clave que primero me inspiró sobre cómo puede verse un sitio personal moderno y limpio, y qué puede contener
Si tuviera que decirlo, ahora mismo SvelteKit + Skeleton me impresiona muchísimo por la velocidad para crear prototipos realmente utilizables
Incluso sin conocer bien Svelte, si entiendes el enrutado basado en archivos, casi todo lo demás es prácticamente HTML hasta que lo necesites; además Tailwind viene por defecto y el tema también se siente bastante cercano a vainilla
En los últimos meses probé varias cosas como Astro, Lit, Next.js, las plantillas integradas de Go, pug y Eleventy, y hasta ahora esta combinación es la que más me gusta en casi todos los aspectos
Basta con ver el propio sitio de Skeleton https://www.skeleton.dev/docs/get-started: aunque presiones Page Down no hace scroll, si pasas el mouse por la barra de navegación tampoco hace scroll, y al imprimir solo se corta la parte visible en pantalla. Ya reporté este problema, pero aunque todavía no parece ser una gran prioridad, muchos sitios siguen usando este patrón de componentes
Skeleton parece asumir que si inviertes los colores del tema oscuro obtienes un buen tema claro, pero en la práctica no es así. DaisyUI es más maduro, más rápido, más usado y se toma en serio la accesibilidad. También sorprende que logre cosas solo con animaciones CSS, sin JS, y resuelve las partes difíciles de HTML/CSS mientras te deja escribir tú mismo la parte fácil de Svelte. Además, depende poco de Svelte, así que es fácil mover el HTML de DaisyUI a otros frameworks
Tailwind funciona de inmediato y desplegarlo en algo como Netlify también es muy sencillo. A día de hoy me parece el mejor generador de sitios estáticos, y creo que es mucho más simple que el enfoque explicado en el artículo
Con
+page.tsy la configuración adecuada, también puedes hacer un sitio web estático, o llevarlo a una app multipágina o de página únicaDios mío, hacer un sitio web con HTML y CSS suena como una locura
Bromas aparte, salvo por las plantillas uso el mismo stack. Si no eres desarrollador web, no termino de ver la necesidad de un framework CSS, y hacerlo a mano es mucho más fácil. También probé generadores de sitios como Hugo, pero no me ahorraron nada de tiempo
Hace unos meses, para mejorar mis habilidades con CSS, intenté recrear los sitios web de algunas empresas, y visualmente pude reproducirlos todos solo con HTML y CSS. Pero los sitios reales de esas empresas ni siquiera aparecían si desactivabas JS
Seguimos apilando frameworks sobre frameworks, lenguajes nuevos y herramientas nuevas, y la mayoría solo aumenta la complejidad y el trabajo de la siguiente generación. El 5% de los sitios web que de verdad necesitan eso son la excepción
También me pareció interesante que fuera un sitio que vende servicios reales, y me dio curiosidad saber en qué rango estaban los precios
Creo que la forma más minimalista y productiva es simplemente usar PHP, porque ese lenguaje fue creado originalmente para ese propósito
Si el sitio es simple, no necesitas composer ni lógica de router; basta con separar archivos de header/footer/navigation e incluirlos en cada página
header.php,pagename.phpyfooter.php. Para sitios simples lo hago así, y es muy fácil y rápidoSi HTML pudiera insertar HTML externo como CSS o JS, incluso esto sería innecesario en la mayoría de los casos. Ojalá simplemente lo permitieran usar libremente
Modificas algo, haces git commit/push y en menos de 30 segundos los cambios ya están reflejados en todo el mundo. Está bastante bien y no necesitas hosting de servidor aparte
Me hace pensar en la frase: “tan simple como sea posible, pero no más simple”. Probablemente no sea de Albert Einstein
HTML + CSS puros, poniendo el CSS dentro de cada etiqueta HTML o dentro de la página, está bien para empezar. Cuando ya son dos páginas, terminas sacando el CSS a un archivo aparte
Pero cuando empiezas a hacer un sitio con varias páginas del mismo tipo, ya necesitas un sistema de plantillas con
includey un generador de sitios estáticosSi las páginas están basadas en datos, necesitas un generador de sitios programable que consuma datos y escupa páginas, y si los datos son “en tiempo real”, entonces tienes que generar páginas por vista, así que como mínimo entras al terreno de PHP, y más allá, al de los frameworks web modernos con un servidor corriendo
Hace poco hice un sitio pro bono relacionado con un hobby. Era un sitio de promoción de baile y eventos, y la dueña es una profesora de baile que no sabe mucho de tecnología. Generé un sitio estático en el plan gratuito de Netlify con Eleventy(https://www.11ty.dev/), y le agregué código de build personalizado para traer datos desde Google Sheet, de modo que la profesora pudiera definir los próximos eventos
Tomó unas cuantas horas hacerlo, pero ahora funciona bien sin costos de operación ni mantenimiento. Me di cuenta de que hay un punto ideal muy potente entre la configuración mínima total y algo del nivel de Rails/Phoenix/Django
Aunque la cantidad de páginas de un sitio casi con seguridad va a pasar de 3, así que puede ser un poco distinto de la probabilidad de que un bloque de código genérico se use 3 veces o más
También me pregunto si la estructura consiste en llamar a la API de Google Sheets desde el cliente para llenar los datos y, si es así, si hay una capa de caché o si cada cliente recibe una copia nueva cada vez
El debate sobre frameworks y complejidad ya de verdad cansa
Si el cliente pide un CMS personalizado con flujo de publicación de múltiples etapas, internacionalización y accesibilidad para cumplimiento normativo, necesitas herramientas potentes para construirlo dentro del tiempo que el cliente espera. En el mundo enterprise hay muchos clientes así, y por eso hay tanta demanda por esas herramientas. Si solo has trabajado en B2C, esto te puede sorprender, pero es la parte sumergida del iceberg de la industria tecnológica
Es cierto que un blog estático no necesita una configuración compleja de Next.js ni una toolchain de Vite. Pero la gente que habla seriamente de estas herramientas no está hablando de hacer un blog sencillo. El ejemplo reducido del tutorial puede ser un blog, pero el problema real es otro
Así que me gustaría que bajara un poco el odio a los frameworks. Si hay una buena idea para hacer sitios web de forma simple, basta con publicar un tutorial, y si resulta atractiva, la gente la usará donde corresponda. Pero ojalá se evite plantearlo como una oposición contra un enemigo vago de “toolchains picantes y frameworks de moda”
O pueden pensar que ya lo saben todo porque llevan tiempo haciendo una app interna con usuarios de dos dígitos y sin requisitos de UX. Ese tipo de juicios con tan poca información termina desplazando la discusión
Solo que esta vez la persona que herede ese código no va a recibir actualizaciones ni va a poder buscar ayuda fácilmente en Stack Overflow
No entiendo por qué se asume que no se pueden usar herramientas distintas para trabajos distintos. Hay veces en las que no necesitas un framework, pero en mi experiencia son raras, a menos que estés haciendo algo muy simple y que no vaya a cambiar mucho
Cuando hay un equipo y un cliente, me cuesta imaginar cómo funcionaría un sitio de “herramientas simples”, y no lo digo como crítica, de verdad no lo sé
Incluso esto ya me suena demasiado complicado
Escribo los textos en Gemtext, o sea, markdown para Gemini, e hice un script en Python que los convierte a HTML y genera la página de índice
El CSS tiene solo 42 líneas, así que lo metí en cada página, y calculé que el costo de agregar 42 líneas por archivo nunca iba a ser mayor que el de una segunda petición HTTP
Fue mucho más simple de lo esperado, sin librerías de Python ni plantillas. La parte más difícil fue generar los correos para enviar a la lista de correo. Pasé meses analizando varios frameworks y generadores de sitios estáticos, y semanas buscando un CSS decente
Según el historial de git, lo terminé tras dos semanas de meterle mano, incluyendo traer 18 años de historial de WordPress. Como es Python puro, no tuve que aprender nada nuevo, y si hay un bug puedo arreglarlo o cambiarlo fácilmente. Porque es mi código
Los científicos de la computación se han olvidado por completo de que uno puede simplemente programar una solución temporal a medida en vez de intentar reutilizar todo. El tiempo de aprender y adaptar es mayor que el tiempo de hacerlo directamente
Código: https://git.sr.ht/~lioploum/ploum.net
Sitio: https://ploum.net
Mi sitio lo sirve un procesador 6502 tallado en madera balsa en 2003 y pegado con epoxi a un cable Ethernet. Cuando quiero cambiarlo, caliento la EPROM con una secadora para que se volteen los bits que quiero. Sin plantillas, sin código, sin bloat
Ir bajando y repasar la historia de la tecnología provoca una sensación de nostalgia
Si no lo entendí mal, no parece muy distinto de un generador de sitios estáticos promedio. Se ve como la diferencia entre crear archivos HTML con plantillas Jinja basadas en Python y Jekyll, que crea archivos HTML/Markdown con plantillas Liquid basadas en Ruby
Creo que un sitio en PHP con
includeo un generador de sitios estáticos ya hecho tendría mucho más sentidoNo lo entiendo. Es como no querer un generador de sitios estáticos, así que terminó usando un generador de sitios estáticos hecho por él mismo