AngularAtlased. 22.2

Cap. 11Calitate & performanță52 / 75

DevTools: cum te uiți în aplicație

Chrome DevTools și Angular DevTools pas cu pas: ce arată fiecare panou, cu exerciții care merg chiar pe site-ul ăsta.

Chrome DevTools e inclus în browser și merge pe orice site, inclusiv pe aplicații publicate. Îți arată DOM-ul, request-urile, ce e salvat în browser, cât consumă pagina și ce rămâne în memorie. Angular DevTools e o extensie separată, care adaugă un tab „Angular” cu arborele de componente, profiler-ul, injectorii și rutele.

Pașii de mai jos folosesc numele exacte ale butoanelor din Chrome DevTools, luate din codul lui sursă. Fiecare secțiune are un exercițiu pe care îl poți face chiar pe pagina asta.

Pe scurt
  • Pe un site publicat (build de producție) numele claselor sunt minificate, window.ng nu există, iar Angular DevTools refuză să pornească. Pentru acestea îți trebuie aplicația ta, pornită cu ng serve.
  • Elements, Network, Application, Performance monitor și heap snapshot-urile merg oriunde. Caută după tag-uri și tipuri native, nu după numele claselor tale.
  • Un leak se vede ca un număr care crește la fiecare repetare și nu mai scade: JS event listeners în Performance monitor, # Delta pozitiv în Comparison.
  • DevTools poate ține el însuși obiecte în viață: ce ai selectat în Elements sau ai afișat în Console. Golește consola înainte de ultimul snapshot.
De ce nu vezi nimic pe un site publicat
  • Numele claselor sunt minificate. În heap snapshot nu apare LeakyWidget, ci e, Ge sau dc. Tag-urile HTML (<app-leaky-widget>) și tipurile native ale browserului (DOMTimer, EventListener) rămân însă lizibile.
  • Utilitarele ng.* din consolă există doar în development. Pe site-ul publicat ng e undefined.
  • Angular DevTools nu funcționează pe build-uri de producție. Afișează „We detected an application built with production configuration. Angular DevTools only supports development builds.”
  • Exemplele HTTP de pe site folosesc un backend simulat, în browser. Request-urile lor nu ajung în Network. Laboratorul de mai jos face un request real, ca să ai ce urmări.

Deschide DevTools și găsește orice panou

  • Deschizi DevTools cu F12 sau Ctrl+Shift+I (Windows, Linux), respectiv Cmd+Option+I (Mac). Sau click dreapta pe pagină → Inspect.
  • Panourile sunt tab-uri sus: Elements, Console, Sources, Network, Performance, Memory, Application. Cele care nu încap sunt sub ».
  • Cel mai rapid drum spre orice: meniul de comenzi, cu Ctrl+Shift+P sau Cmd+Shift+P. Scrii „memory” și alegi Show Memory, sau „performance monitor” și alegi Show Performance monitor.
  • Esc deschide și închide drawer-ul de jos, cu Console. Așa vezi consola lângă orice alt panou.

Exersează pe pagina asta

Ține DevTools deschis lângă pagină. Fiecare cartonaș spune ce apeși aici și ce cauți acolo.

LivePatru exerciții pentru Elements, Console, Network și Application

Elements

Apasă iconița de inspectare din colțul DevTools (sau Ctrl+Shift+C / Cmd+Shift+C) și dă click pe textul gri de lângă buton. Apoi apasă +1 de câteva ori: în Elements, atributul data-clicks clipește la fiecare schimbare.

data-clicks="0"

Console

Apasă butonul, apoi în Console scrie atlas în câmpul Filter. Dă click pe săgeata din fața obiectului ca să-l desfaci.

Network

În Network alege filtrul Fetch/XHR și apasă butonul. Apare rândul robots.txt?atlas-lab=1. Dă click pe el și treci prin Headers, Response și Timing.

Pune throttling-ul pe Slow 4G și trimite din nou: timpul crește, iar în Timing vezi unde se duce.

Application

Salvează un text, apoi deschide Application → Storage → Local storage → adresa site-ului. Dă dublu-click pe valoarea cheii atlas-devtools-lab, schimb-o, apoi apasă Citește din nou.

Ce e acum în localStorage: null

Tot acolo e și cheia atlas-progress: progresul tău prin lecții, ținut doar în browserul tău.

Toate merg și pe site-ul publicat: nimic nu depinde de numele claselor.

Elements: ce a randat Angular

Elements arată DOM-ul de acum, nu HTML-ul trimis de server. Câteva lucruri pe care le lasă Angular în el:

  • Pe elementul rădăcină (<app-root>) apare atributul ng-version, cu versiunea exactă de Angular. Pe site-ul ăsta: 22.2.2.
  • Atributele _nghost-ng-c… și _ngcontent-ng-c… vin din încapsularea stilurilor (modul Emulated). În panoul Styles din dreapta, selectorii arată ca .btn[_ngcontent-ng-c…].
  • Comentariile goale <!----> sunt ancorele lui Angular pentru @if, @for și @defer: locul unde inserează sau scoate conținut.
  • Elementul selectat e disponibil în Console ca $0. Atributele și textul care se schimbă clipesc o clipă în Elements: așa vezi ce actualizează Angular.

Console: utilitarele ng (doar în development)

În aplicația ta pornită cu ng serve, Angular pune în pagină un obiect global ng. Selectezi un element în Elements, apoi în Console:

// Elements: selectează un element; în Console el e $0 (doar development)
ng.getComponent($0)          // componenta al cărei host e $0
ng.getOwningComponent($0)    // componenta în al cărei template stă $0
ng.getDirectives($0)         // directivele de pe $0
ng.getInjector($0)           // injectorul elementului: .get(UnServiciu)
ng.getListeners($0)          // listenerii puși de Angular pe $0
ng.getRootComponents()       // componentele rădăcină

const c = ng.getComponent($0);
c.count.set(42);             // un semnal se scrie direct; Angular randează singur
c.title = 'Test';            // o proprietate simplă are nevoie de applyChanges
ng.applyChanges(c);

Pe un build de producție aceste funcții nu există. Asta nu e o eroare: sunt eliminate intenționat, ca să nu încarce aplicația.

Network: ce cere aplicația

Network înregistrează doar cât timp e deschis. Dacă îl deschizi după ce pagina s-a încărcat, reîncarcă pagina.

  • Filtrele de sus (Fetch/XHR, JS, CSS, Img…) și câmpul de text îți lasă doar request-urile care te interesează.
  • Click pe un request: Headers (URL, status, headere), Payload (ce ai trimis), Preview și Response (ce a venit), Initiator (ce cod l-a pornit), Timing (unde s-a dus timpul).
  • Keep log (în versiunile mai vechi: Preserve log) păstrează lista la navigare sau reîncărcare. Disable cache ocolește cache-ul cât DevTools e deschis.
  • Meniul Throttling simulează o rețea mai lentă: Fast 4G, Slow 4G, 3G sau Offline. Așa vezi skeleton-urile, stările de încărcare și ce se întâmplă fără rețea.

Application: ce ține aplicația în browser

  • Storage → Local storage / Session storage → adresa site-ului: cheile și valorile, pe care le poți edita sau șterge.
  • Cookies, IndexedDB și Cache storage sunt în același loc. Cache storage e locul unde un Service Worker ține fișierele pentru offline.
  • Secțiunea Service workers arată worker-ul activ. Update on reload forțează versiunea nouă la fiecare reîncărcare, iar Bypass for network îl ocolește. Amândouă sunt utile cât lucrezi la el.
  • Storage → Clear site data șterge tot ce a salvat site-ul. E cel mai sigur mod de a testa „prima vizită”.

Performance monitor: verificarea rapidă

Înainte de snapshot-uri, uită-te la cifre live:

  1. Meniul de comenzi (Ctrl/Cmd+Shift+P) → „performance monitor” → Show Performance monitor. Se deschide jos, în drawer.
  2. Urmărește JS heap size, DOM nodes și JS event listeners. Dai click pe un nume ca să-i arăți sau să-i ascunzi graficul.
  3. În laboratorul de mai jos, cu reparațiile debifate, apasă Deschide și închide de 10 ori. JS event listeners crește cu 10 și rămâne acolo. Apasă Curăță zombie-urile: scade la loc. Cu toate reparațiile bifate, nu crește deloc.

Memory: un leak găsit pas cu pas

Laboratorul din lecția despre memory leaks, aici, ca să ai ce măsura. Fiecare widget închis cu reparațiile debifate lasă în urmă un timer, un listener și o abonare, care țin componenta în memorie.

LiveWidget-uri care scapă din memorie
Închide la destroy:

Niciun widget pe pagină.

distruse, încă vii
0
memorie reținută
0.00 MB
muncă de zombie
0/s
subscripții
0
timere
0
listeneri
0
widget-uri create
0
Debifează reparațiile, apasă Deschide și închide de 10 ori, apoi urmează pașii de dedesubt.

Heap snapshot și Comparison

  1. Deschide panoul Memory. La Select profiling type alege Heap snapshot.
  2. Apasă iconița de coș, Collect garbage, apoi Take snapshot. În stânga apare Snapshot 1.
  3. În pagină, cu reparațiile debifate, apasă Deschide și închide de 10 ori și așteaptă să se termine.
  4. Din nou Collect garbage și Take snapshot: apare Snapshot 2.
  5. Cu Snapshot 2 selectat, schimbă primul meniu din bara de sus din Summary în Comparison. Meniul de lângă arată cu ce compari: Snapshot 1.
  6. Scrie în Filter by class numele din tabelul de mai jos și uită-te la coloanele # New și # Delta.
  7. Apasă Curăță zombie-urile, fă Snapshot 3 și compară-l cu Snapshot 2: aceleași rânduri apar acum la # Deleted.
Filter by class# DeltaCe înseamnă
app-leaky-widget+10Elementele host ale celor 10 widget-uri, scoase din pagină, dar încă ținute în memorie. Se vede și pe site-ul publicat.
DOMTimer+10Cele 10 setInterval care încă rulează. E un tip nativ al browserului, deci numele rămâne lizibil și în producție.
EventListener+10Listenerii puși pe document și nescoși niciodată.
LeakyWidget+10Clasa componentei. Apare doar în development (de obicei ca _LeakyWidget). În producție numele e minificat, așa că acolo cauți după tag.

Cine ține obiectul: Retainers

Desfă un rând și dă click pe o instanță. Panoul Retainers de jos arată cine o ține în viață: rândurile de sus sunt referințele directe, iar când le desfaci urci pe lanț, spre ceva ce trăiește mult (Window, un listener, un timer). Coloana Distance spune câți pași sunt până la window. Leak-ul e veriga pe care codul tău trebuia s-o rupă la distrugere.

Mai direct: Detached elements

  1. În Memory → Select profiling type alege Detached elements.
  2. Repetă acțiunea din pagină, apoi apasă Get detached elements.
  3. Lista arată elementele scoase din pagină, dar încă referite din JavaScript. Aici: câte un <app-leaky-widget> pentru fiecare widget închis.
DevTools ține și el obiecte în viață
Un element pe care l-ai selectat în Elements, un obiect pe care l-ai afișat cu console.log sau un rezultat din Console rămân în memorie cât timp DevTools are nevoie de ele. Dacă un snapshot tot arată obiecte după ce ai curățat, golește consola (iconița cu cerc tăiat sau Ctrl+L, pe Mac Cmd+K), selectează alt element și repetă. În Summary, filtrul Objects retained by DevTools Console arată exact aceste obiecte.

Performance: ce se întâmplă în timp

  • Record înregistrează cât faci ceva în pagină. Record and reload reîncarcă pagina și înregistrează pornirea.
  • Bifează Show memory timeline ca să vezi, pe aceeași axă, heap-ul JS, documentele, nodurile și listenerii. Un leak arată ca o scară care urcă și nu mai coboară.
  • În development, Angular poate adăuga o pistă proprie, Angular, cu componente, change detection și hook-uri. O pornești cu ng.enableProfiling() în Console, înainte de Record.
// în Console, în aplicația ta pornită cu ng serve:
ng.enableProfiling();

// sau în main.ts, ca să prinzi și pornirea:
import { enableProfiling } from '@angular/core';

enableProfiling();
bootstrapApplication(App, appConfig);

Angular DevTools

Extensia vede aplicația așa cum o vede Angular: componente, input-uri, semnale, injectori, rute.

  1. Instalează Angular DevTools din Chrome Web Store (există și pentru Firefox).
  2. Pornește aplicația ta cu ng serve, deschide DevTools și caută tab-ul Angular, eventual sub ». Pe pagina „New tab” a browserului extensiile nu rulează.
  3. Pe un build de producție, inclusiv pe site-ul ăsta, vei vedea doar mesajul „We detected an application built with production configuration”. E normal.
TabCe vezi
ComponentsArborele de componente și directive, inclusiv blocurile @defer. Click pe o componentă: input-uri, output-uri și proprietăți în dreapta. Click dreapta pe o valoare ca s-o editezi.
ProfilerFiecare ciclu de change detection ca o bară; cu cât e mai înaltă, cu atât a durat mai mult. Pornești cu cercul din stânga sus (Start recording). Bifa Change detection arată ce componente au fost verificate efectiv.
Injector TreeIerarhia injectorilor de mediu și de element și drumul pe care îl face o căutare de dependență (Angular 17+).
Router TreeArborele rutelor: path, componentă, guards, resolvers, lazy sau nu, care e activă.
  • $ng0 în Console e componenta selectată acum în Angular DevTools, $ng1 e cea dinainte.
  • Iconița de inspectare din colțul extensiei: treci cu mouse-ul peste pagină și vezi ce componentă e acolo.
  • Dublu-click pe o componentă te duce la elementul ei în Elements; iconița din dreapta sus te duce la sursa ei în Sources.
  • Show Signal Graph, în capul panoului de proprietăți, desenează semnalele, computed-urile și effect-urile componentei și cine pe cine citește (Angular 19+). Dă-le un debugName ca să aibă nume citibile.

Sursele obișnuite ale leak-urilor și cum închizi fiecare sunt la Memory leaks. Ce faci după ce ai găsit ce e lent, la Performanță și Change detection.

Capcane frecvente

  • Cauți numele clasei tale pe un build de producție. Nu e acolo: caută după tag sau după tipuri native, ori pornește aplicația cu ng serve.
  • Compari snapshot-uri fără Collect garbage înainte: heap-ul urcă și coboară singur, iar diferențele mici nu înseamnă nimic.
  • Repeți acțiunea o singură dată. Un leak e un număr care crește cu același pas la fiecare repetare. Repetă de 10 ori și caută +10.
  • Deschizi Network după ce pagina s-a încărcat și crezi că nu s-a cerut nimic. Network înregistrează doar cât e deschis: reîncarcă pagina.

Fișă rapidă

F12 · Ctrl+Shift+I · Cmd+Option+I            deschide DevTools
Ctrl+Shift+C · Cmd+Shift+C                   alege un element din pagină
Ctrl+Shift+P · Cmd+Shift+P                   meniul de comenzi
Esc                                          drawer-ul cu Console

Network       Fetch/XHR · Keep log · Disable cache · Throttling
Application   Storage → Local storage · Service workers · Clear site data
Perf monitor  JS heap size · DOM nodes · JS event listeners
Memory        Heap snapshot → Take snapshot → Comparison → Filter by class
Memory        Detached elements → Get detached elements
Performance   Record · Record and reload · Show memory timeline

doar în development:
  ng.getComponent($0) · ng.applyChanges(c) · ng.enableProfiling()
  Angular DevTools: Components · Profiler · Injector Tree · Router Tree · $ng0

Cap. 11 · 0 din 4 terminate

Ai terminat lecția?

Marcheaz-o și apare pe harta ta: în cuprins și pe prima pagină.

Se marchează singură după ce citești toată lecția.

  1. Performanță — checklist
  2. Testare cu Vitest
  3. DevTools: cum te uiți în aplicație
  4. Angular Aria
Vezi toată harta ta

Toate cele 75 de pagini · scrie ca să filtrezi

  • 01Ce e nou în Angular 21 & 22Toate schimbările importante din v21 și v22, pe scurt, cu link către pagina care le explică.Start
  • 01Prima ta aplicație, pas cu pasO listă de lecturi construită de la o componentă goală la o aplicație terminată — signals, @for, input-uri și output-uri, un serviciu și un formular, pas cu pas.Start
  • 01Decizii rapide„Unde pun asta?”, „Signal sau Observable?”, „Shared sau feature?” — răspunsuri scurte la întrebările de zi cu zi.Start
  • 01Întrebări de interviu Angular60 de întrebări reale de interviu pentru junior, mid și senior, cu răspunsul de dat, întrebarea care urmează și greșelile de evitat. Plus o simulare de interviu.Start
  • 02Standalone & bootstrapCum pornește o aplicație fără NgModule: bootstrapApplication, app.config.ts, imports în componentă.Fundamente moderne
  • 02Data binding și evenimenteInterpolare, binding pe proprietăți și pe atribute, evenimente cu $event și filtre de taste și cum e construit [( )] — ce intră în DOM și ce se întoarce.Fundamente moderne
  • 02Control flow: @if, @for, @switchSintaxa de blocuri care înlocuiește *ngIf/*ngFor/ngSwitch, cu track, @empty și verificare exhaustivă.Fundamente moderne
  • 02@let și expresiile noi din templateVariabile locale cu @let, arrow functions, spread, regex, instanceof, comentarii în tag-uri.Fundamente moderne
  • 02@defer — lazy loading în templateÎncarci componente grele doar când e nevoie: triggere, prefetch, placeholder, loading, error.Fundamente moderne
  • 02Class & style bindingsDe ce [class.x] și [style.x] au înlocuit ngClass și ngStyle (cu migrare automată din v21).Fundamente moderne
  • 02Stilurile componentelor și încapsularea:host, cele trei moduri de încapsulare, teme cu variabile CSS și de ce ::ng-deep e ultima soluție.Fundamente moderne
  • 02Pipes: când și cumPipe pur vs impur, pipe custom și cum alegi între pipe, computed() și o metodă.Fundamente moderne
  • 03signal() și computed()Primitivele reactive: stare scriibilă, stare derivată, egalitate, untracked și reguli de imutabilitate.Signals & reactivitate
  • 03effect() — când DA, când NUEfecte secundare sincronizate cu semnale: localStorage, logging, API-uri imperative. Și capcanele lor.Signals & reactivitate
  • 03linkedSignal() — stare derivată editabilăUn semnal care se resetează când se schimbă sursa, dar pe care îl poți și seta manual.Signals & reactivitate
  • 03resource, rxResource, httpResourceDate asincrone ca semnale: status, value, error, reload, anulare automată. Stabile din v22.Signals & reactivitate
  • 03debounced() — semnale cu întârziereVarianta „debounce” a unui semnal, fără RxJS. Perfect pentru căutare.Signals & reactivitate
  • 03Liste: căutare, filtrare, sortare, paginareUn lanț de computed-uri care recalculează doar ce s-a schimbat, cu filtrele ținute în URL, ca un link să redeschidă aceeași vedere.Signals & reactivitate
  • 03Observables de la zeroCe e un Observable, subscribe și unsubscribe, operatorii pe care îi folosești în fiecare săptămână, cold vs hot — și când ajunge un signal.Signals & reactivitate
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — și când RxJS rămâne alegerea bună.Signals & reactivitate
  • 04input() și output()Inputuri ca semnale (required, transform, alias) și outputuri tipizate. Data down, events up.Componente: comunicare
  • 04model() — two-way bindingBanana-in-a-box [( )] cu un singur API. Când îl folosești și când e mai bine input + output.Componente: comunicare
  • 04viewChild & contentChildInterogări ca semnale: viewChild, viewChildren, contentChild, contentChildren, opțiunea read.Componente: comunicare
  • 04Lifecycle & DestroyRefCe hook-uri mai contează în era signals, afterNextRender, DestroyRef și ngOnChanges tipizat.Componente: comunicare
  • 04Content projectionng-content cu select, sloturi multiple, conținut implicit și capcana proiecției condiționale.Componente: comunicare
  • 04ng-template & ngTemplateOutletTemplate-uri ca valori: render props în Angular, context tipizat și personalizare de componente.Componente: comunicare
  • 05Smart vs DumbContainer vs presentational: cine ține starea, cine doar afișează, și cum le împarți corect.Design de componente
  • 05Componente generice <T>Un DataTable<T> sau Select<T> tipizat corect, cu template-uri pentru celule.Design de componente
  • 05Componente dinamiceNgComponentOutlet, createComponent cu inputBinding/outputBinding și un dashboard construit din config.Design de componente
  • 05Directive & host compositionDirective atribut, metadata host: {} și Directive Composition API (hostDirectives).Design de componente
  • 05Controale custom de formularFormValueControl (Signal Forms) vs ControlValueAccessor: un rating cu stele, în ambele variante.Design de componente
  • 05Change detectionOnPush e implicit din v22, zone.js lipsește din v21. Ce declanșează randarea și cum să nu te arzi.Design de componente
  • 06inject() & @Service()Noul decorator @Service() din v22, inject() vs constructor și contextul de injecție.Dependency Injection
  • 06Providers & ierarhia de injectoriRoot vs rută vs componentă, useClass/useValue/useFactory/useExisting și modificatorii optional/self/skipSelf.Dependency Injection
  • 06InjectionToken & provideX()Configurare tipizată, funcții provideFeature(), makeEnvironmentProviders și inițializatori.Dependency Injection
  • 06injectAsync() — servicii lazyÎncarci un serviciu greu abia când ai nevoie de el, cu prefetch la idle.Dependency Injection
  • 07Structura de folderecore / shared / features, ce intră în fiecare și cum arată un feature pe dinăuntru.Arhitectura aplicației
  • 07Shared vs featureCând muți o componentă în shared și (mai ales) când NU. Checklist concret.Arhitectura aplicației
  • 07Interfețe & modeleInterfață inline sau fișier separat? DTO vs model de domeniu, type vs interface, unde le pui.Arhitectura aplicației
  • 07State management cu signalsStore-uri simple pe semnale, facade, stare locală vs globală și când îți trebuie NgRx.Arhitectura aplicației
  • 07Style guide & namingConvențiile oficiale actuale: nume de fișiere fără sufixe, protected, readonly, ordinea membrilor.Arhitectura aplicației
  • 07Barrels, aliasuri & granițeindex.ts, path aliases, API public pe feature și reguli de dependență care se pot verifica automat.Arhitectura aplicației
  • 07Erori: @boundary & ErrorHandlerNoul bloc @boundary din v22.2, ErrorHandler global, erori HTTP și erori din resource.Arhitectura aplicației
  • 08Routing modern & lazy loadingloadComponent, rute copil, parametri ca input-uri și moștenirea parametrilor (default nou în v22).Routing
  • 08Guards & resolverscanActivate, canMatch, canDeactivate și resolve ca funcții, cu redirect prin UrlTree / RedirectCommand.Routing
  • 09Signal Forms — bazeleFormulare construite pe semnale: form(), [formField], validare prin schemă. Stabile din v22.Formulare
  • 09Signal Forms — avansatValidare custom și cross-field, async/HTTP cu debounce, liste dinamice, disabled/hidden, scheme reutilizabile.Formulare
  • 09Reactive Forms tipizateFormGroup tipizat, nonNullable, FormArray — și cum conviețuiesc cu Signal Forms.Formulare
  • 10HttpClient, interceptors & API layerHttpClient fără setup (v21), Fetch implicit (v22), interceptori funcționali și stratul de API cu mapare DTO.HTTP & date
  • 11Performanță — checklistCe chiar contează: OnPush + signals, track, @defer, lazy routes, imagini, bundle și hidratare.Calitate & performanță
  • 11Testare cu VitestVitest e runner-ul implicit din v21. TestBed, componente cu semnale, servicii, HTTP și harness-uri.Calitate & performanță
  • 11DevTools: cum te uiți în aplicațieChrome DevTools și Angular DevTools pas cu pas: ce arată fiecare panou, cu exerciții care merg chiar pe site-ul ăsta.Calitate & performanță
  • 11Angular AriaComponente headless, accesibile, pe care le stilizezi cum vrei: tabs, accordion, menu, listbox...Calitate & performanță
  • 12SSR, prerender & render modesCând randezi pe server, când la build și când doar în browser: RenderMode pe rută, app.routes.server.ts și costurile reale.SSR & hidratare
  • 12Hidratare: event replay & incrementalCum preia browserul HTML-ul de pe server fără să-l refacă: hidratare completă, event replay, @defer (hydrate on …) și erorile de nepotrivire.SSR & hidratare
  • 12Cod compatibil cu serverulwindow nu există pe server: PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, cache-ul HTTP și PendingTasks.SSR & hidratare
  • 13Micro frontendsCând merită să spargi o aplicație în mai multe deploy-uri și când e doar complexitate: Native Federation, Module Federation, iframes, Web Components.Arhitectură la scară
  • 13Web Components cu Angular ElementscreateCustomElement: o componentă Angular folosită ca tag HTML oriunde, plus comunicarea între aplicații prin evenimente și BroadcastChannel.Arhitectură la scară
  • 13Monorepo, librării & granițeUn workspace cu mai multe aplicații și librării: ng generate library, Nx, entry points secundare, publicare și reguli de dependență.Arhitectură la scară
  • 13Arhitectură hexagonală (ports & adapters)Domeniul fără Angular, porturi ca clase abstracte și adaptoare interschimbabile: HTTP, localStorage sau in-memory, fără să atingi UI-ul.Arhitectură la scară
  • 14Semnalele pe dinăuntruGraful reactiv: producători și consumatori, push-pull, de ce computed e lazy și glitch-free, problema diamantului și când rulează efectele.Reactivitate avansată
  • 14RxJS avansat: operatori de ordin superiorswitchMap, mergeMap, concatMap și exhaustMap pe o diagramă live, plus retry cu backoff, shareReplay și cum eviți scurgerile.Reactivitate avansată
  • 14NgRx SignalStoreState management la scară pe semnale: withState, withComputed, withMethods, rxMethod, entități și hooks — și când un store simplu e suficient.Reactivitate avansată
  • 14Mașini de stări cu signalsFără stări imposibile: o mașină tipizată pe signals, cu tranziții, guards și diagrama stărilor, live.Reactivitate avansată
  • 15WebSockets: timp real care rezistă rețeleiUn socket tipizat ca signals: reconectare cu backoff și jitter, heartbeat, coadă de mesaje cât ești offline și siguranță la SSR.Timp real și offline
  • 15Actualizări optimiste și rollbackInterfață instantanee, dar onestă: snapshot și rollback, răspunsuri sosite în altă ordine, chei de idempotență.Timp real și offline
  • 15Offline-first: Service Worker și cacheService Worker-ul Angular: strategii de cache, anunțarea versiunilor noi și o coadă pentru modificările făcute offline.Timp real și offline
  • 16Web WorkersCalcule grele fără să blochezi interfața: un worker real în pagină, comunicare prin mesaje și când nu merită.UI & performanță avansată
  • 16Liste uriașe: virtual scroll100.000 de rânduri fără lag: CDK virtual scroll, itemSize, trackBy și alternativele (paginare, infinite scroll).UI & performanță avansată
  • 16Animații moderne & View Transitionsanimate.enter și animate.leave în locul @angular/animations (depreciat), tranziții CSS și View Transitions la navigare.UI & performanță avansată
  • 16Memory leaks: cum le găsești și le repariSubscripții, timere și listeneri care trăiesc mai mult decât componenta lor — cum îi vezi în DevTools și cum îi închizi.UI & performanță avansată
  • 17Securitate: XSS, sanitizare & CSPCe face Angular automat împotriva XSS, când devine periculos bypassSecurityTrust, plus CSP cu nonce, Trusted Types și XSRF.Securitate & globalizare
  • 17Autentificare: token-uri & refreshUn interceptor care atașează token-ul, reîmprospătează o singură dată la 401 și reia cererile din coadă — plus unde ții token-ul.Securitate & globalizare
  • 17OAuth 2.1 și OpenID Connect cu PKCEFluxul authorization code cu PKCE, pas cu pas: verifier și challenge, state și nonce, ID token-ul și de ce un BFF e mai sigur.Securitate & globalizare
  • 17Internaționalizare (i18n)$localize, atributul i18n, ICU plural/select, build per limbă vs. traduceri la runtime și formatarea după locale.Securitate & globalizare