Hono: Framework para aplicaciones web
Cuando me enfrento a un nuevo proyecto, ya sea una API para una aplicación móvil o un backend para un sitio web, siempre busco herramientas que me hagan la vida más simple y fácil. No quiero mantener configuraciones complejas ni enfocar esfuerzos a optimizar código con un framework pesado que consuma más recursos de los necesarios. Mis prioridades son simples: quiero que sea rápido, ligero y que se integre sin problemas con Deno, que es el entorno de ejecución de TypeScript que he adoptado para casi todo.
Y ahí es donde entra Hono.
Descubrí Hono buscando una alternativa moderna a Express.js (un framework que usé durante años en el mundo de Node.js). Aunque Express es casi de facto el framework web para node.js, sentía que se estaba quedando desactualizado no encajaba del todo con la simplicidad y seguridad que me ofrecía Deno. Necesitaba algo que se sintiera más nativo, más ágil y moderno.
Lo que me convenció de Hono fue precisamente eso. Es increíblemente liviano, casi no añade overhead a mi aplicación, y su rendimiento es espectacular. Pero la verdadera joya de la corona, para mí, es su versatilidad. Aunque mi ecosistema principal es Deno, Hono me da la tranquilidad de saber que mi código es portable. Si el día de mañana decido mover una API a Cloudflare Workers para que corra en el edge (más cerca de los usuarios), o si un cliente me pide desplegarla en un servidor tradicional con Node.js, puedo hacerlo con cambios mínimos. Esa libertad es algo que valoro muchísimo.
Como vengo del mundo de Express, empezar con Hono fue muy sencillo. La forma de definir rutas, gestionar peticiones (req) y respuestas (res) y usar middlewares es tan intuitiva y familiar que no sentí que hiciera un esfuerzo adicional, es decir, si vienes del mundo Express, la curva de aprendizaje es rápida.
En este post quiero contarte, desde mi experiencia, por qué Hono se ha convertido en mi framework de cabecera para casi cualquier proyecto web que involucre un backend.
Manos a la Obra: Tu Primer Proyecto con Hono y Deno
Ya te conté por qué me gusta Hono, ahora vamos a la práctica para que veas lo rápido que es empezar.
Primero, abre tu terminal, crea una carpeta para el proyecto y entra en ella:
1 | mkdir mi-proyecto-hono && cd mi-proyecto-hono |
Deno tiene un comando muy práctico para inicializar proyectos que nos ahorra bastante trabajo. Usaremos el siguiente:
1 | deno init |
Este comando te creará una estructura básica con un main.ts y un deno.json. Ahora, para instalar Hono, agregamos la dependencia en el archivo deno.json y luego simplemente lo importamos en nuestro main.ts. Deno lo descargará y cacheará la primera vez que ejecutes el código.
Puedes agregar Hono como dependencia usando JSR de la siguiente forma, pero debes editar el archivo deno.json para corregir el alias en el import.
1 | deno add jsr:@hono/hono |
El corazón de tu proyecto - deno.json
Antes de ver el código, echemos un vistazo al deno.json. Aquí es donde Deno gestiona las dependencias y tareas. Para usar Hono, podemos añadirlo a la sección imports o usar la línea de comandos de deno para agregar la dependencia:
1 | { |
Un detalle importante es que, como ves, Hono está disponible en JSR (el nuevo registro de paquetes de JavaScript), lo que hace que manejar las versiones sea muy limpio.
Primer controlador
Ahora sí, el código de main.ts. Es tan simple y elegante como esto:
1 | import { Hono } from "hono"; |
¿Qué hace este código?
- Importa
Hono. - Crea una nueva instancia de la aplicación.
- Define una ruta para el método
GETen la URL raíz (/). - Cuando alguien visita esa ruta, le devuelve el texto “Hello Hono!”.
- Finalmente,
Deno.serveinicia el servidor.
Para ponerlo en marcha, usamos la tarea que definimos en deno.json:
1 | deno task start |
Como Deno es seguro por defecto, te pedirá permiso para acceder a la red. ¡Y listo! Ya tienes un servidor corriendo. Si usas una herramienta como httpie, verás esto:
1 | $ http :8000/ |
¿Y si quiero devolver JSON?
Fácil. Hono tiene un método específico para eso. Simplemente cambia c.text() por c.json():
1 | app.get("/", (c) => { |
El resultado ahora será una respuesta JSON perfecta:
1 | $ http :8000/ |
En solo unos minutos, hemos montado un servidor web funcional. Esta simplicidad y rapidez es lo que me terminó de convencer de la combinación de Hono y Deno.
¿ Cómo cambiar el puerto del servidor ?
Esto me costó pillarlo en su momento, así que dejo aquí cómo se hace:
1 | Deno.serve({ port: 8080 }, app.fetch); |
Revisemos algunos middlewares útiles
logger
Un middleware bien útil es el de logger, permite registrar (o loggear) lo que entra y lo que sale a Hono (obviamente depende de la ubicación en el archivo principal de la aplicación.)
1 | import { Hono } from "hono"; |
Con esta configuración se puede obtener este tipo de logs.
1 | Listening on http://0.0.0.0:8000/ (http://localhost:8000/) |
etag
La cabecera o header ETag (que viene de Entity Tag o “etiqueta de entidad”) es básicamente una huella digital o un identificador único que el servidor le asigna a una versión específica de un recurso (como una página, una imagen o un archivo JSON).
Imagina que tienes un archivo en tu servidor. Cada vez que modificas y guardas ese archivo, su ETag cambia. Es como el número de versión de ese recurso en un momento exacto.
¿Y para qué sirve?
Su propósito principal es hacer que el cacheo sea mucho más eficiente y ahorrar ancho de banda. El flujo es el siguiente:
- Primera Visita: Cuando tu navegador pide un recurso (ej: styles.css) por primera vez, el servidor se lo envía completo y, además, incluye el header ETag con su “huella digital”. Por ejemplo: ETag: “v1-a2b3c4d5”.
- El Navegador Guarda la Huella: Tu navegador guarda el archivo styles.css en su caché y también anota su ETag.
- Siguientes Visitas: La próxima vez que necesite ese mismo archivo, el navegador no lo pide a ciegas. En su lugar, le pregunta al servidor: “Oye, tengo una versión de styles.css con la huella v1-a2b3c4d5. ¿Sigue siendo la buena?”. Esto lo hace enviando un header llamado If-None-Match: “v1-a2b3c4d5”.
- El Servidor Decide:
- Si la “huella digital” del archivo en el servidor coincide con la que envió el navegador, significa que el archivo no ha cambiado. El servidor responde con un 304 Not Modified. Este mensaje es muy liviano, no contiene el archivo, y básicamente le dice al navegador: “Todo sigue igual, usa la copia que ya tienes en tu caché”.
- Si la “huella digital” no coincide, significa que el archivo fue actualizado. El servidor responde con un 200 OK, envía la nueva versión del archivo y, por supuesto, su nuevo
ETag.
En resumen, el ETag permite al navegador evitar volver a descargar recursos que no han cambiado, haciendo que la navegación sea mucho más rápida y consuma menos datos. Además ayuda a las capas superiores de la aplicación a tomar mejores decisiones respecto del cache de la aplicación.
Ahora la configuración para Hono:
1 | import { Hono } from "hono"; |
Finalmente esta será la respuesta donde aparece una cabecera con el etag.
1 | http :8000/ |
cors
Probablemente, uno de los “problemas” más comunes al empezar a desarrollar una API es toparse con un error de CORS en el navegador.
Imagina que los sitios web son como reinos amurallados. Por seguridad, un reino (tudominio.com) no puede simplemente enviar un mensajero a pedirle recursos a otro reino (api.otrodominio.com). Esta regla se llama Política del Mismo Origen (Same-Origin Policy) y es fundamental para la seguridad en la web.
El middleware de CORS de Hono es el pasaporte diplomático que nos permite configurar qué “reinos” externos tienen permiso para comunicarse con nuestra API.
Por ejemplo, una configuración de CORS muy específica y segura podría ser así:
1 | import { Hono } from 'hono'; |
Analicemos las reglas que hemos definido en este bloque:
app.use('/api/*', ...): Primero, le indicamos a Hono que aplique este middleware únicamente a las rutas que comiencen con/api/. Esto es muy práctico para tener políticas de seguridad distintas para diferentes partes de tu aplicación.origin: 'http://example.com': La regla más importante. Se especifica que solo las peticiones que vengan desdehttp://example.comestán permitidas.allowMethods: [...]: Define qué métodos HTTP están autorizados (POST,GET,OPTIONS). UnDELETEsería bloqueado.allowHeaders: [...]: Una lista blanca de las cabeceras HTTP que el cliente tiene permitido enviar.exposeHeaders: [...]: Permite que el código JavaScript del cliente pueda leer cabeceras de la respuesta que, por defecto, el navegador oculta por seguridad, comoContent-Length.maxAge: 600: Una optimización de rendimiento. Indica al navegador que puede guardar en caché el resultado de la petición de “verificación” (preflight) durante 600 segundos (10 minutos).credentials: true: Esencial si tu frontend necesita enviar credenciales como cookies o cabeceras de autenticación (Authorization).
En resumen, este middleware te da un control muy granular para configurar una política de CORS segura, una práctica mucho más recomendable que simplemente abrir el acceso a todo el mundo con origin: '*'.
Palabras al Cierre
Como hemos visto en este recorrido, Hono se presenta como una alternativa muy atractiva en el ecosistema de JavaScript y TypeScript. Su filosofía minimalista, su rendimiento y, sobre todo, su capacidad para adaptarse a cualquier entorno de ejecución, lo convierten en una herramienta que vale la pena tener en nuestro arsenal.
Personalmente, la combinación de la simplicidad de Hono con la seguridad y el entorno moderno de Deno ha hecho que desarrollar APIs vuelva a ser una experiencia ágil y productiva.
Pero esto es solo el comienzo. Este artículo es el primero de una serie donde exploraremos a fondo el ecosistema de Deno y Hono. En las próximas entregas, veremos temas un poco más avanzados como:
- Creación de nuestros propios middlewares.
- Helpers de Hono
- Rutas avanzadas y manejo de grupos.
- Estrategias de testing para nuestras APIs.
Te invito a que experimentes con lo que hemos visto hoy y, por supuesto, a que te mantengas atento para los próximos artículos de la serie.
Referencias Útiles
Aquí te dejo una lista de enlaces que te serán de gran ayuda para profundizar en Hono y Deno:
- Sitio y Documentación Oficial de Hono: El mejor lugar para empezar y la fuente de consulta principal.
- Repositorio de Hono en GitHub: Para ver el código fuente, reportar issues o contribuir.
- Middleware de Hono: La lista completa de middlewares oficiales disponibles.
- Benchmarks de Rendimiento de Hono: Para los que se preguntan qué tan rápido es Hono en realidad.
- Sitio y Documentación Oficial de Deno: Indispensable para entender el entorno de ejecución.
- JSR (JavaScript Registry): El nuevo registro de paquetes para JavaScript y TypeScript, donde Hono y muchos otros módulos modernos residen.
- httpie: El cliente HTTP para terminal usado en los ejemplos.
Hono: Framework para aplicaciones web
https://blog.pcollaog.cl/2025/10/28/Hono-Framework-para-aplicaciones-web/