Skip to content

Técnicas de depuración de RxJS

Debido a la naturaleza de los streams asincrónicos, la depuración de RxJS requiere un enfoque diferente al de las técnicas tradicionales de depuración sincrónica.

Esta página proporciona estrategias básicas para depurar aplicaciones RxJS y navegación hacia técnicas detalladas de depuración.

Descripción general de las técnicas de depuración

La depuración de RxJS se puede categorizar en los siguientes cuatro enfoques

EnfoqueContenidoPágina de detalle
Estrategia básicaoperador tap, herramientas de desarrollo, RxJS DevToolsExplicado en esta página
Escenarios comunesSeis problemas típicos: no fluyen valores, fugas de memoria, errores no detectados, etc.→ Detalles
Herramientas personalizadasStreams con nombre, operadores de depuración, medición de rendimiento→ Detalles
RendimientoMonitoreo de suscripciones, detección de reevaluación, verificación de uso de memoria, mejores prácticas→ Detalles

Estrategias básicas de depuración

1. Salida de log con el operador tap

El operador tap es la técnica de depuración más básica, que permite observar los valores del stream sin efectos secundarios.

ts
import { interval } from 'rxjs';
import { map, filter, tap } from 'rxjs';

interval(1000)
  .pipe(
    tap(value => console.log('🔵 Valor original:', value)),
    map(x => x * 2),
    tap(value => console.log('🟢 Después de map:', value)),
    filter(x => x > 5),
    tap(value => console.log('🟡 Después de filter:', value))
  )
  .subscribe(value => console.log('✅ Valor final:', value));

// Salida:
// 🔵 Valor original: 0
// 🟢 Después de map: 0
// 🔵 Valor original: 1
// 🟢 Después de map: 2
// 🔵 Valor original: 2
// 🟢 Después de map: 4
// 🔵 Valor original: 3
// 🟢 Después de map: 6
// 🟡 Después de filter: 6
// ✅ Valor final: 6

Puntos clave

  • Inserte un tap en cada paso del pipeline para rastrear el flujo de datos
  • Use pictogramas y etiquetas para mejorar la visibilidad del log
  • Los logs de depuración se pueden insertar de forma segura porque tap no cambia los valores

2. Información de log detallada

Para obtener información de depuración más detallada, use el objeto Observer.

ts
import { of, throwError, concat } from 'rxjs';
import { tap } from 'rxjs';

const debug = (tag: string) =>
  tap({
    next: value => console.log(`[${tag}] next:`, value),
    error: error => console.error(`[${tag}] error:`, error),
    complete: () => console.log(`[${tag}] complete`)
  });

// Stream normal
of(1, 2, 3)
  .pipe(debug('Normal'))
  .subscribe();

// Salida:
// [Normal] next: 1
// [Normal] next: 2
// [Normal] next: 3
// [Normal] complete

// Stream con error
concat(
  of(1, 2),
  throwError(() => new Error('Ocurrió un error'))
)
  .pipe(debug('Error'))
  .subscribe({
    error: () => {} // Manejo de errores
  });

// Salida:
// [Error] next: 1
// [Error] next: 2
// [Error] error: Error: Ocurrió un error

3. Verificación con herramientas de desarrollo

Esta es una técnica de depuración que utiliza las herramientas de desarrollo del navegador.

ts
import { fromEvent, timer } from 'rxjs';
import { map, tap, debounceTime } from 'rxjs';

// Función auxiliar para depuración
function tapDebugger<T>(label: string) {
  return tap<T>({
    next: value => {
      console.group(`🔍 ${label}`);
      console.log('Valor:', value);
      console.log('Tipo:', typeof value);
      console.log('Timestamp:', new Date().toISOString());
      console.trace('Stack trace');
      console.groupEnd();
    }
  });
}

// Depuración de eventos de clic de botón
const button = document.querySelector('button');
if (button) {
  fromEvent(button, 'click')
    .pipe(
      tapDebugger('Click Event'),
      debounceTime(300),
      tapDebugger('After Debounce'),
      map(() => ({ timestamp: Date.now() }))
    )
    .subscribe(data => console.log('📤 Enviar:', data));
}

Utilización de herramientas de desarrollo

  • Agrupar logs con console.group()
  • Mostrar trazas de pila con console.trace()
  • Mostrar arrays y objetos en un formato fácil de leer con console.table()
  • Colocar puntos de interrupción en tap

4. Utilización de RxJS DevTools

RxJS DevTools es una herramienta de depuración proporcionada como extensión del navegador.

Instalación

Características principales

  • Visualización del estado de suscripción de Observable
  • Visualización de línea de tiempo de valores del stream
  • Detección de fugas de memoria
  • Análisis de rendimiento

Ejemplo de uso

ts
import { interval } from 'rxjs';
import { take, map } from 'rxjs';

// Habilitar depuración solo en entorno de desarrollo
// Diferentes herramientas de compilación usan diferentes verificaciones de variables de entorno
const isDevelopment =
  // Vite: import.meta.env.DEV
  // webpack: process.env.NODE_ENV === 'development'
  // Configuración manual: usar variables globales
  typeof window !== 'undefined' && (window as any).__DEV__ === true;

const stream$ = interval(1000).pipe(
  take(5),
  map(x => x * 2)
);

if (isDevelopment) {
  // Hacer observable en DevTools
  stream$.subscribe({
    next: value => console.log('DevTools:', value)
  });
}

Técnicas de depuración detalladas

Una vez que comprenda la estrategia básica, aprenda técnicas de depuración específicas en las páginas detalladas a continuación.

Escenarios comunes de depuración

Seis problemas típicos encontrados en el desarrollo del mundo real y cómo resolverlos

  • Escenario 1: No fluyen valores
  • Escenario 2: Se emite un valor diferente al esperado
  • Escenario 3: La suscripción nunca se completa (stream infinito)
  • Escenario 4: Fuga de memoria (olvidó cancelar la suscripción)
  • Escenario 5: Ocurre un error y no se detecta
  • Escenario 6: Quiero rastrear los intentos de reintento

→ Ver escenarios comunes de depuración

Herramientas de depuración personalizadas

Cómo crear sus propias herramientas de depuración para satisfacer los requisitos de su proyecto

  • Depuración de streams con nombre (tagStream)
  • Creación de operadores de depuración personalizados
  • Operador para medición de rendimiento (measure)

→ Ver herramientas de depuración personalizadas

Depuración de rendimiento

Optimización de aplicaciones y mejores prácticas

  • Verificar y rastrear suscripciones
  • Detectar reevaluaciones innecesarias (shareReplay)
  • Monitorear el uso de memoria
  • Creación de un entorno de depuración
  • Depuración con seguridad de tipos
  • Establecer límites de error

→ Ver depuración de rendimiento

Resumen

La depuración de RxJS se puede realizar de manera eficiente siguiendo estos puntos.

Estrategia básica

  • ✅ Observe cada etapa del stream con el operador tap
  • ✅ Utilice herramientas de desarrollo para obtener logs detallados
  • ✅ Visualice el stream con RxJS DevTools

Escenarios comunes

  • ✅ Los valores no fluyen → Olvidó la suscripción, verifique las condiciones de filtrado
  • ✅ Valor diferente al esperado → Orden de operadores, tenga en cuenta el compartir referencias
  • ✅ Suscripción no completada → use take o takeUntil para streams infinitos
  • ✅ Fugas de memoria → cancelación automática de suscripción con patrón takeUntil
  • ✅ Errores no detectados → implemente un manejo de errores adecuado

Herramientas de depuración

  • ✅ Depuración flexible con operadores de depuración personalizados
  • ✅ Rastree múltiples streams con streams con nombre
  • ✅ Identifique cuellos de botella con medición de rendimiento

Rendimiento

  • ✅ Prevenga fugas de memoria monitoreando las suscripciones
  • ✅ Evite recálculos innecesarios con shareReplay
  • ✅ Verifique el uso de memoria periódicamente

Combinadas, estas técnicas permiten una depuración eficiente de las aplicaciones RxJS.

Páginas relacionadas

Publicado bajo licencia CC-BY-4.0.