Server-Sent Events en JavaScript: Tiempo real sin WebSocket

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué son Server-Sent Events y por qué los necesita?

\n\n

Imagine: abrió un sitio web con tipos de cambio de divisas, y el valor del dólar cambia ante sus ojos — sin recargar la página, sin presionar botones. O está esperando el resultado del procesamiento de un archivo grande en el servidor, y de repente aparece una línea: «Listo al 70%». ¿Cómo funciona esto? Una de las formas más elegantes son los Server-Sent Events (SSE).

\n\n

SSE es una tecnología que permite al servidor enviar datos al cliente de forma independiente en cualquier momento, tan pronto como estén disponibles. A diferencia de WebSocket, SSE solo funciona en una dirección — del servidor al cliente. Pero ahí radica su superpoder: es increíblemente simple, eficiente e ideal para tareas donde el cliente solo necesita recibir actualizaciones.

\n\n

En este artículo, analizaremos cómo usar Server-Sent Events en JavaScript, escribiremos código funcional y entenderemos cuándo SSE es la mejor opción, y cuándo es mejor mirar hacia WebSocket. ¿Listo? ¡Vamos allá!

\n\n

¿Cómo funcionan Server-Sent Events (SSE)?

\n\n

Técnicamente, SSE es simplemente una conexión HTTP que el servidor no cierra después de enviar la respuesta. En su lugar, envía datos en partes, utilizando el formato especial text/event-stream. El cliente (navegador) escucha esta conexión a través del objeto EventSource y genera eventos al recibir cada nuevo mensaje.

\n\n

Así es como se ve una respuesta típica del servidor:

\n\n
data: {"message": "¡Hola!", "timestamp": 1700000000}\n\ndata: {"message": "Nueva notificación", "timestamp": 1700000001}
\n\n

Cada mensaje comienza con data:, seguido de un espacio y el contenido en sí. Los mensajes se separan con dos caracteres de nueva línea \\n\\n. El servidor también puede enviar identificadores (id:) y tipos de eventos (event:), pero el conjunto mínimo es data.

\n\n

La parte del cliente es aún más simple:

\n\n
const eventSource = new EventSource('/events');\n\neventSource.onmessage = (e) => {\n    console.log('Datos recibidos:', e.data);\n};\n\neventSource.onerror = (e) => {\n    console.error('Error de conexión', e);\n};
\n\n

¡Eso es todo! Sin apretones de manos complejos, sin bibliotecas — el navegador se reconecta automáticamente cuando se interrumpe, maneja la pérdida de conexión por sí mismo. Esta es la magia principal de los Server-Sent Events.

\n\n

SSE vs WebSocket: ¿cuándo elegir qué?

\n\n

A menudo, los principiantes piensan: «Como SSE es más simple, entonces siempre es mejor». Pero no es así. Cada tecnología tiene su propio nicho. Comparemos.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CaracterísticaSSEWebSocket
Dirección de los datosSolo servidor → clienteBidireccional
Simplicidad de implementaciónMuy simple (nativo del navegador)Media (se necesita biblioteca)
Reconexión automáticaIncorporadaHay que implementarla manualmente
Soporte en navegadoresTodos los modernos (excepto IE)

Blogs

Book Recommendations