
Putovanje od Zone.js do Signala
Za Angular developere, reaktivnost je godinama bila sinonim za Zone.js. Ova biblioteka je omogućavala "magično" osvežavanje UI-ja tako što je presretala (monkey-patching) gotovo sve asinhrone operacije u browseru. Iako je to olakšavalo početni razvoj, cena je bila visoka: nepredvidivi ciklusi detekcije promena i otežan debugging.
Danas, sa stabilizacijom Zoneless režima u verzijama 20 i 21, Angular prelazi na precizan, graf-baziran model reaktivnosti pomoću Signala.
Zašto napuštamo Zone.js?
Problem sa Zone.js je što on zna da se nešto desilo, ali ne zna šta se promenilo. Zbog toga Angular mora da prođe kroz celo stablo komponenti (od vrha do dna) kako bi proverio gde je nastala promena.
U enterprise aplikacijama sa stotinama modula, ovo dovodi do:
- Performance overhead-a: Nepotrebni ciklusi detekcije koji troše CPU.
- Većeg bundle-a: Zone.js dodaje oko 33KB vašoj aplikaciji, što direktno utiče na Core Web Vitals.
- Netransparentnosti: Stack trace grešaka je često zatrpan internim frejmovima Zone.js biblioteke.
Signali: Precizna reaktivnost (Fine-grained)
Signali menjaju paradigmu iz "guraj promene svuda" (push) u "prati samo ono što se koristi" (pull-based reactivity).
Glavni gradivni blokovi su:
signal(): Vaš primarni izvor stanja.computed(): Izvedena stanja koja su lazy i memoized (računaju se samo kad su potrebna i kad se zavisnosti promene).effect(): Za sporedne efekte poput logovanja ili manuelne sinhronizacije sa DOM-om.
Ovaj pristup omogućava Angularu da vrši hirurški precizne update-ove. Umesto skeniranja celog stabla, ažurira se samo onaj deo template-a koji direktno zavisi od signala koji je promenjen.
Novi standard za komponente
Migracija na signale donosi i potpuno nove, funkcionalne API-je koji zamenjuju stare dekoratore:
| Stari API | Novi Signal API | Prednost |
|---|---|---|
@Input() |
input() |
Read-only signal, podržava integrisane transformacije |
@Output() |
output() |
Čistija sintaksa, ne zahteva više EventEmitter |
@ViewChild() |
viewChild() |
Reaktivna pretraga, nema više undefined grešaka pre ngAfterViewInit |
Put ka Zoneless stabilnosti
Ako želite da izvučete maksimum (i onih 100/100 na Lighthouse-u), cilj je Zoneless Angular. S obzirom da je zoneless detekcija promena sada podrazumevano ponašanje u modernom Angularu, evo kako izgleda proces u dva koraka:
- Eksplicitna reaktivnost: Svaka promena stanja mora proći kroz signale ili
AsyncPipe. Više nema "slučajnog" osvežavanja. - Uklanjanje tereta: Brišete
zone.jsiz polyfills sekcije u fajluangular.jsoni deinstalirate paket.
Rezultat? Benchmarci pokazuju 50–70% bržu detekciju promena i do 35% manje re-rendera u poređenju sa tradicionalnim RxJS pristupom u enterprise sistemima.
Šta sa RxJS-om?
Signali ne zamenjuju RxJS. Oni su tu za UI state, dok RxJS ostaje neprikosnoven za asinhronu orkestraciju (HTTP pozivi, WebSockets, kompleksni streamovi). Koristite @angular/core/rxjs-interop (funkcije poput toSignal i toObservable) da povežete ova dva sveta bezbolno.
Zaključak
Prelazak sa Zone.js na Signale nije samo kozmetička promena koda. To je prelazak na arhitekturu koja je brža, lakša za debugging i spremna za budućnost weba. Za enterprise aplikacije, ovo je razlika između sistema koji "koči" i onog koji se skalira bez napora.
Tehničke napomene za implementaciju:
- Testiranje: U zoneless okruženju,
fakeAsyncviše ne radi. Pređite na nativniasync/awaitifixture.whenStable(). - Debugging: Koristite
provideCheckNoChangesConfig({exhaustive: true})tokom razvoja da uhvatite promene stanja koje Angular ne detektuje.