Volver al blog

Signals: El Estandar de Reactividad Que Esta Unificando JavaScript

Hola HaWkers, un cambio significativo esta ocurriendo en el ecosistema JavaScript. Signals, un patron de reactividad que gano popularidad en frameworks como Solid, Preact y Angular, esta avanzando para convertirse en parte nativa del lenguaje a traves de una propuesta TC39.

Entendamos que son Signals, por que importan, y como esta estandarizacion puede cambiar el desarrollo frontend.

Que Son Signals

Concepto Basico

Signals son primitivas reactivas que representan valores que pueden cambiar a lo largo del tiempo, notificando automaticamente a quien depende de ellos.

Analogia simple:

Piensa en una hoja de calculo Excel. Cuando cambias el valor de una celda, todas las formulas que dependen de esa celda se recalculan automaticamente. Signals funcionan de la misma forma en el codigo.

Componentes principales:

  1. Signal: Un valor reactivo que puede ser leido y escrito
  2. Computed: Un valor derivado que recalcula automaticamente cuando las dependencias cambian
  3. Effect: Una funcion que se ejecuta cuando los signals que lee cambian

Ejemplo basico:

// Creando un signal
const count = signal(0);

// Leyendo el valor
console.log(count.value); // 0

// Actualizando el valor
count.value = 1;

// Computed: valor derivado
const doubled = computed(() => count.value * 2);
console.log(doubled.value); // 2

// Effect: reacciona a cambios
effect(() => {
  console.log(`Count is now: ${count.value}`);
});

count.value = 5; // Automaticamente registra: "Count is now: 5"

Por Que Signals Estan Ganando Popularidad

Problemas Que Signals Resuelven

Los modelos de reactividad anteriores tenian limitaciones que Signals abordan.

Limitaciones del modelo React (Virtual DOM):

Problema Descripcion
Re-render excesivo Componentes enteros se re-renderizan por cualquier cambio
Overhead de memoria Virtual DOM requiere copia del arbol
Complejidad useEffect, useMemo, useCallback para optimizar
Depuracion dificil Cadena de actualizaciones puede ser confusa

Limitaciones de Two-Way Binding:

Problema Descripcion
Rastreo dificil Dificil saber que causo un cambio
Ciclos infinitos Posibles loops de actualizacion
Performance Verificaciones constantes de cambio

Como Signals resuelven:

  1. Granularidad fina: Solo lo que cambio se actualiza
  2. Rastreo automatico: Dependencias se detectan automaticamente
  3. Sin overhead: No hay Virtual DOM ni diffing
  4. Previsibilidad: Flujo de datos claro y unidireccional
  5. Simplicidad: Menos APIs para memorizar

Signals en los Frameworks Actuales

Quien Ya Usa Signals

Varios frameworks han adoptado Signals como modelo de reactividad.

Solid.js:

import { createSignal, createEffect } from "solid-js";

function Counter() {
  const [count, setCount] = createSignal(0);

  createEffect(() => {
    console.log("Count changed:", count());
  });

  return (
    <button onClick={() => setCount(count() + 1)}>
      Count: {count()}
    </button>
  );
}

Preact Signals:

import { signal, computed } from "@preact/signals";

const count = signal(0);
const doubled = computed(() => count.value * 2);

function Counter() {
  return (
    <button onClick={() => count.value++}>
      Count: {count} (Doubled: {doubled})
    </button>
  );
}

Angular Signals (17+):

import { signal, computed, effect } from '@angular/core';

@Component({
  template: `
    <button (click)="increment()">
      Count: {{ count() }}
    </button>
  `
})
export class Counter {
  count = signal(0);
  doubled = computed(() => this.count() * 2);

  constructor() {
    effect(() => {
      console.log('Count:', this.count());
    });
  }

  increment() {
    this.count.update(v => v + 1);
  }
}

Vue 3 (Composition API):

import { ref, computed, watchEffect } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const doubled = computed(() => count.value * 2);

    watchEffect(() => {
      console.log('Count:', count.value);
    });

    return { count, doubled };
  }
};

La Propuesta TC39 Para Signals

Que Se Esta Proponiendo

El TC39 esta trabajando para estandarizar Signals como parte del lenguaje JavaScript.

Objetivos de la propuesta:

  1. Interoperabilidad: Signals de diferentes frameworks pueden trabajar juntos
  2. Optimizacion por runtime: Los motores pueden optimizar Signals nativamente
  3. API estandarizada: Una unica forma de hacer reactividad
  4. Ecosistema unificado: Las bibliotecas pueden depender de Signals nativos

API propuesta (preliminar):

// Creacion de signal
const counter = new Signal.State(0);

// Lectura
console.log(counter.get()); // 0

// Escritura
counter.set(1);

// Computed
const doubled = new Signal.Computed(() => counter.get() * 2);

// Watcher (similar a effect)
const watcher = new Signal.subtle.Watcher(() => {
  console.log('Something changed!');
});

watcher.watch(counter);

Estado actual:

Aspecto Estado
Stage Stage 1 (propuesta inicial)
Champions Rob Eisenberg, Daniel Ehrenberg
Implementaciones Ninguna nativa aun
Polyfills Disponibles para experimentacion
Prevision 2-3 anos para Stage 4

Como Funcionan Signals Por Dentro

Mecanismo de Rastreo

Entender como Signals rastrean dependencias ayuda a usarlos mejor.

Algoritmo basico:

// Pseudocodigo del mecanismo
class Signal {
  #value;
  #subscribers = new Set();

  constructor(initialValue) {
    this.#value = initialValue;
  }

  get value() {
    // Cuando alguien lee, registra como dependiente
    if (currentlyRunningComputation) {
      this.#subscribers.add(currentlyRunningComputation);
    }
    return this.#value;
  }

  set value(newValue) {
    if (this.#value !== newValue) {
      this.#value = newValue;
      // Notifica a todos los dependientes
      for (const subscriber of this.#subscribers) {
        subscriber.notify();
      }
    }
  }
}

Grafo de dependencias:

  count ─────┬─────> doubled ───> UI

             └─────> effect ───> console.log

Cuando count cambia:
1. doubled recalcula
2. effect se ejecuta
3. UI actualiza (solo la parte afectada)

Performance Comparada

Signals ofrecen ventajas significativas de rendimiento.

Benchmark tipico (operaciones/segundo):

Operacion Virtual DOM Signals Diferencia
Actualizacion simple 10,000 100,000 10x
Lista con 1000 items 500 5,000 10x
Updates batched 2,000 50,000 25x
Memoria usada 100% 30% -70%

Numeros ilustrativos basados en benchmarks publicos

Impacto Para Desarrolladores

Que Cambia en la Practica

Si Signals son estandarizados, varias cosas cambian.

Para desarrolladores React:

  • Modelo mental diferente (push vs pull)
  • Menos hooks de optimizacion necesarios
  • Posible integracion via bibliotecas
  • React puede o no adoptar Signals internamente

Para desarrolladores Vue/Angular:

  • Ya familiarizados con conceptos similares
  • Migracion puede ser gradual
  • APIs pueden converger hacia el estandar

Para desarrolladores de bibliotecas:

  • Base comun para construir
  • Menos reinvencion de la rueda
  • Mejor composabilidad entre bibliotecas

Aprendiendo Signals Hoy

Si quieres prepararte, hay formas de empezar ahora.

Opciones para experimentar:

// 1. Preact Signals (funciona con React tambien!)
npm install @preact/signals-react

// 2. Solid.js para proyectos nuevos
npm create solid

// 3. Angular 17+ (signals nativos)
ng new my-app

// 4. Signal polyfill de la propuesta
npm install signal-polyfill

Recursos recomendados:

  • Documentacion oficial de Solid.js
  • Posts del blog de Angular sobre Signals
  • Propuesta TC39 en GitHub
  • Tutoriales interactivos de Preact

Signals vs Otros Enfoques

Comparacion Detallada

Como Signals se compara a otras formas de gestionar estado.

Signals vs useState (React):

// useState - rerenderiza componente entero
const [count, setCount] = useState(0);

// Signal - actualiza solo donde se usa
const count = signal(0);

Signals vs Redux:

Aspecto Redux Signals
Boilerplate Alto Bajo
Curva de aprendizaje Alta Media
DevTools Excelente En desarrollo
Performance Buena (con selectors) Excelente (nativo)
Scope Global Local o global

Signals vs RxJS:

Aspecto RxJS Signals
Complejidad Alta Baja
Flexibilidad Muy alta Media
Casos de uso Streams complejos UI reactiva
Curva Empinada Suave

El Futuro de la Reactividad en JavaScript

Tendencias y Predicciones

Que podemos esperar en los proximos anos.

Convergencia de frameworks:

"En 2026, ya vemos Angular, Vue, Solid y Preact usando variantes de Signals. La estandarizacion por TC39 puede ser el paso final para unificar el ecosistema."

Posibles escenarios:

  1. Signals nativos: JavaScript gana Signals como parte del lenguaje (2027-2028)
  2. Adopcion universal: Todos los principales frameworks usan Signals
  3. React se adapta: React puede adoptar Signals o crear alternativa compatible
  4. Herramientas mejoran: DevTools evolucionan para debugging de Signals

Implicaciones para Arquitectura

Signals pueden cambiar como estructuramos aplicaciones.

Patrones emergentes:

  • State machines con Signals
  • Signals + Server Components
  • Signals en Web Workers
  • Signals para animaciones

Anti-patrones a evitar:

  • Signals demasiados (granularidad excesiva)
  • Ignorar ciclos de dependencia
  • Usar Signals para datos que no cambian
  • No limpiar effects (memory leaks)

Conclusion

Signals representa una evolucion significativa en la forma en que pensamos sobre reactividad en JavaScript. Con frameworks convergiendo hacia este modelo y una propuesta TC39 en curso, es probable que Signals se convierta en el estandar de facto para construir interfaces reactivas. Para desarrolladores, el momento de empezar a aprender es ahora.

Puntos principales:

  1. Signals son primitivas reactivas con rastreo automatico de dependencias
  2. Ya estan disponibles en Solid, Preact, Angular y Vue (concepto similar)
  3. Propuesta TC39 busca estandarizar Signals en el lenguaje
  4. Performance superior al Virtual DOM en muchos escenarios
  5. Aprender Signals ahora prepara para el futuro del frontend

El ecosistema JavaScript se esta moviendo hacia mayor consistencia y performance. Signals es parte central de esa evolucion.

Para mas sobre evolucion de JavaScript, lee: Pattern Matching en JavaScript: La Propuesta TC39 Que Cambiara Tu Codigo.

Vamos con todo! 🦅

Comentarios (0)

Este artículo aún no tiene comentarios 😢. ¡Sé el primero! 🚀🦅

Añadir comentarios