Migrar una app Angular a zoneless + signals
provideZonelessChangeDetection() y dejar que los signals dirijan la reactividad.
Por qué deshacerse de zone.js
setTimeout , las promesas, los eventos del DOM y desencadena un ciclo de detección global cada vez. En una app grande, se verifican miles de bindings cuando solo tres han cambiado. El modo zoneless invierte la lógica: nada se vuelve a pintar mientras un signal leído en el template no haya notificado su cambio.
- ›
bundle más ligero: se elimina una dependencia de ~100 ko - ›
trazas de pila legibles: sin más frames de zone.runpor todas partes - ›
detección dirigida: solo los componentes que dependen del signal modificado son marcados
Activar el modo zoneless
provideZoneChangeDetection y se conecta el provider zoneless:
Pensar en reactividad fina
signal() , los valores derivados por computed() , y los efectos secundarios por effect() :
Las trampas que hay que conocer
setTimeout(() => this.value = x) sin pasar por un signal ya no refrescará la vista. Lo mismo ocurre con las suscripciones RxJS: hay que usar toSignal() o llamar a signal.set() dentro del subscribe . En cuanto a los tests, se cambia Vitest a modo zoneless y se reemplazan los fakeAsync / tick por await fixture.whenStable() . La documentación oficial detalla cada caso en la guide zoneless .
El zoneless no hace que una app sea mágicamente más rápida. Hace que la reactividad sea explícita : sabes exactamente por qué algo se vuelve a pintar, y eso es lo que lo cambia todo al depurar.