Esta guía explica cómo usar WebSocket nativo en una aplicación React, con un enfoque en entender cómo se conecta, recibe y maneja mensajes del servidor.
- Es una conexión persistente entre el cliente y el servidor.
- Permite enviar y recibir mensajes en tiempo real.
- A diferencia de HTTP, no es request-response, sino que ambos pueden iniciar la comunicación.
const ws = new WebSocket("ws://localhost:3000")✅ Esto crea la conexión al servidor WebSocket. Solo se hace una vez.
ws.onmessage = (event) => {
const data = JSON.parse(event.data)
console.log("📩 Mensaje recibido:", data)
}event.dataes una cadena de texto (normalmente JSON)- Usamos
JSON.parse()para convertirlo a un objeto - Puedes verificar
data.typepara saber qué tipo de evento es
const payload = {
type: "custom_event",
message: "Hola desde el frontend"
}
ws.send(JSON.stringify(payload))🔁 Los mensajes se envían como JSON serializado. El servidor decidirá cómo procesarlos.
ws.close()Esto cierra manualmente la conexión. No es obligatorio, pero recomendable si el componente se desmonta.
// ws.ts
export type WSMessage = {
type: string
[key: string]: any
}// ws.ts
type OnMessage = (data: WSMessage) => void
export function initWebSocket(onMessage: OnMessage): WebSocket {
const ws = new WebSocket("ws://localhost:3000")
ws.onopen = () => {
console.log("✅ WebSocket conectado")
}
ws.onmessage = (event) => {
const data = JSON.parse(event.data)
console.log("📩 WS:", data)
onMessage(data) // 🔁 Reenviamos al componente
}
ws.onclose = () => {
console.log("❌ WebSocket cerrado")
}
ws.onerror = (err) => {
console.error("⚠️ WebSocket error:", err)
}
return ws
}useEffect(() => {
const ws = initWebSocket((data) => {
if (data.type === "product_created") {
fetchProducts() // 🔁 Vuelve a cargar la lista
}
})
return () => ws.close() // 🛑 Limpieza al desmontar
}, [])- 🔌 Se crea una conexión WebSocket con
new WebSocket(...). - 🎧 El frontend escucha mensajes usando
.onmessage. - 🧠 Según
data.type, se toma acción (ej. volver a cargar productos). - 🔁 El componente actualiza su estado si es necesario.
- 📤 También puede enviar mensajes si lo requiere (ej. notificaciones, comandos).
- No crees múltiples conexiones WebSocket sin cerrarlas.
- Reusa la conexión o ciérrala con
ws.close()cuando ya no se necesite. - Nunca asumas que los mensajes tienen siempre la misma forma, verifica el
type.
- El frontend se conecta automáticamente.
- Escucha eventos como
product_created. - Vuelve a hacer un
GET /productspara actualizar los datos visibles. - Se actualiza el componente automáticamente sin recargar la página.