Hono en Node vs Edge
Despliega la misma API de Hono en Node 24 o en tiempos de ejecución edge (Cloudflare Workers, Deno, Bun) con compensaciones de portabilidad.
Receta
Patrón de portabilidad de referencia rápida.
// aplicación compartida (agnóstica al tiempo de ejecución)
import { Hono } from "hono";
export const app = new Hono();
app.get("/health", (c) => c.json({ ok: true }));
app.get("/users/:id", (c) => c.json({ id: c.req.param("id") }));
// Entrada de Node: src/node.ts
import { serve } from "@hono/node-server";
import { app } from "./app.js";
serve({ fetch: app.fetch, port: 3000 });
// Entrada de Cloudflare Worker: src/worker.ts
import { app } from "./app.js";
export default app;Cuándo usarlo: APIs que deben ejecutarse tanto en servidores tradicionales como en edge/CDN para latencia o estrategia multi-runtime.
Ejemplo de trabajo
Aplicación portable con adaptadores específicos para el tiempo de ejecución:
// app.ts - rutas compartidas
import { Hono } from "hono";
import { cors } from "hono/cors";
export function createApp() {
const app = new Hono();
app.use("*", cors());
app.get("/api/status", (c) => c.json({ runtime: "hono" }));
return app;
}
// node.ts
import { serve } from "@hono/node-server";
import { createApp } from "./app.js";
const app = createApp();
serve({ fetch: app.fetch, port: Number(process.env.PORT ?? 3000) });
// worker.ts (Cloudflare)
import { createApp } from "./app.js";
export default createApp();
// wrangler.toml
// name = "my-api"
// main = "src/worker.ts"
// compatibility_date = "2024-01-01"Lo que esto demuestra:
- Fábrica
createApp()compartida para todos los tiempos de ejecución - Node usa
@hono/node-server; los Workers exportan la aplicación directamente - CORS y las rutas son agnósticas al tiempo de ejecución
- La configuración del entorno difiere por objetivo de despliegue
Análisis Profundo
Comparación de Tiempos de Ejecución
| Factor | Node 24 | Cloudflare Workers | Deno | Bun |
|---|---|---|---|---|
| Arranque en frío | N/A (larga duración) | < 5ms | Varía | Rápido |
| Límite de tiempo de CPU | Ninguno | 30s (de pago) | Ninguno | Ninguno |
| Sistema de archivos | Completo | Ninguno (KV/R2) | Completo | Completo |
| Sockets TCP | Sí | No (solo fetch) | Sí | Sí |
| Paquetes npm | Todos | Subconjunto compatible | Registro de Deno | La mayoría de npm |
| Modelo de costos | Servidor/pod | Por solicitud | Servidor | Servidor |
Lo que se Porta Limpiamente
- Definiciones de rutas y middleware
- Manejo de solicitudes/respuestas JSON
- Validación Zod a través de
@hono/zod-validator - Autenticación JWT a través de
hono/jwt - Encabezados CORS y de seguridad
Lo que No se Porta
- Uso directo de
node:fs,node:net - Controladores de bases de datos nativos (usar basados en HTTP o compatibles con edge)
- Tareas en segundo plano de larga duración
- WebSocket (limitado en Workers; usar Durable Objects)
Errores comunes
- Usar APIs solo de Node en código compartido - falla en Workers. Solución: abstraer detrás de adaptadores; usar
fetchpara I/O. - Controlador de PostgreSQL en edge - TCP no disponible en Workers. Solución: usar el controlador sin servidor de Neon, Supabase HTTP o Prisma Accelerate.
- Asumir CPU ilimitada - los Workers tienen límites de tiempo de CPU. Solución: mantener los manejadores rápidos; descargar el trabajo pesado a colas.
- Las variables de entorno difieren -
process.enven Node,envbinding en Workers. Solución: pasar la configuración acreateApp(config). - No hay conexiones persistentes en edge - cada solicitud está aislada. Solución: usar Durable Objects o un almacén de estado externo.
- Probar solo en Node - sorpresas en el tiempo de ejecución edge en producción. Solución: probar con
wrangler devo Miniflare.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Solo Node (Fastify/Express) | Se necesita la superficie completa de la API de Node | La latencia global de edge es crítica |
| Solo Edge (Workers) | Sensible a la latencia, con muchas lecturas | Computación pesada, base de datos TCP |
| Hono portable | Se necesitan ambos con código compartido | Se tiene certeza de un solo tiempo de ejecución |
| Serverless (Lambda) | Ecosistema de AWS | Se necesita un arranque en frío de sub-milisegundos |
Preguntas Frecuentes
¿Debo ejecutar Hono en Node o Workers?
Node para características completas de la API (DB TCP, sistema de archivos, WebSockets). Workers para latencia global en endpoints de lectura simples.
¿Puedo compartir el 100% del código entre Node y edge?
La lógica de rutas sí. El acceso a la base de datos, la E/S de archivos y la configuración necesitan adaptadores específicos para el tiempo de ejecución.
¿Cómo me conecto a PostgreSQL desde Workers?
Usa controladores basados en HTTP: @neondatabase/serverless, cliente de Supabase o Prisma con Accelerate.
¿Es Bun un buen tiempo de ejecución para Hono?
Sí. Bun tiene soporte nativo para Hono y un arranque rápido. Bueno para desarrollo y despliegue si tu operación soporta Bun.
¿Cómo afecta esto a las pruebas?
Prueba createApp() con app.request() de Hono (similar a Fastify inject). No se necesita binding de puerto.
¿Qué hay de OpenAPI en Hono?
@hono/zod-openapi genera OpenAPI a partir de esquemas Zod. Funciona en todos los tiempos de ejecución.
¿El despliegue edge reemplaza el almacenamiento en caché de CDN?
No. La computación edge ejecuta la lógica cerca de los usuarios. El almacenamiento en caché estático es complementario. Usa ambos.
¿Cómo decido entre Node y edge?
Usa la matriz de decisión en Lista de verificación de selección de framework.
Relacionado
- Conceptos básicos de Hono - para empezar
- Conceptos básicos de Serverless - patrones sin servidor
- Mitigación de arranque en frío - arranques en frío en edge
- Lista de verificación de selección de framework - matriz completa
- Mejores prácticas de frameworks ligeros - lista de verificación de la sección
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.