Signals represent a fundamentally different reactivity model from push-based Observables. Where an Observable pushes values downstream through a subscription chain, a Signal is a reactive value container that notifies only the specific computed expressions or effects that read it. The update propagates by pulling the current value lazily rather than pushing a new value eagerly. Angular 20, released May 2025, stabilized Signals after years of development. The practical impact is measurable: zoneless Angular applications—those that eliminate Zone.js entirely—save approximately 100KB of bundle weight and avoid the costly zone.js change detection cycle that fired on every async event globally. `signal(initialValue)` creates a writable signal; `computed(() => expr)` creates a derived signal that re-evaluates only when its dependencies change; `effect(() => sideEffect)` runs a callback whenever its signal dependencies change. The State of React 2025 survey, covering 3,760 developers, found that 37% report `useEffect` as problematic—a data point that explains the appeal of the signal model's more explicit dependency tracking. The TC39 signals proposal (separate from async-iterator-helpers, also Stage 2 in 2025) aims to standardize the Signal primitive across JavaScript frameworks—Angular, Solid, Preact, Vue's `ref()`—reducing the fragmentation that currently forces framework-specific adapters. If standardized, Signals would join Promises and Observables as a first-class async primitive at the language level. The performance model differs from Observables: Signals avoid the subscription tree that Observables build at runtime. In a complex Angular form with 50 bindings, an Observable-based approach builds 50 subscriptions; a Signal-based approach rebuilds only the computed expressions that actually read changed values. In Solid.js, which has used fine-grained reactivity since its inception, this translates to DOM updates that touch exactly the elements whose data changed—no virtual DOM diffing required. Signals are not a replacement for RxJS in async event-driven code. They are a better primitive for synchronous derived UI state. The two models are complementary, and Angular's `toSignal()` / `toObservable()` bridge makes composing them straightforward.
Comments on "Signals & Fine-Grained Reactivity"
Create a free account or sign in to join the discussion.
Sign in to join the conversation