AngularAtlasAusg. 22.2

Kap. 11Qualität & Performance52 / 75

DevTools: ein Blick in deine App

Chrome DevTools und Angular DevTools Schritt für Schritt: was jedes Panel zeigt, mit Übungen, die auf dieser Website funktionieren.

~0 Min. Lesezeit Offizielle Doku

Chrome DevTools ist im Browser eingebaut und funktioniert auf jeder Website, auch bei veröffentlichten Apps. Es zeigt dir das DOM, die Requests, was im Browser gespeichert ist, wie viel die Seite verbraucht und was im Speicher bleibt. Angular DevTools ist eine eigene Erweiterung, die einen Tab „Angular“ mit Komponentenbaum, Profiler, Injectoren und Routen ergänzt.

Die Schritte unten verwenden die exakten Button-Namen aus Chrome DevTools, entnommen aus dessen Quellcode. Jeder Abschnitt hat eine Übung, die du direkt auf dieser Seite machen kannst.

Kurz gesagt
  • Auf einer veröffentlichten Website (Production-Build) sind Klassennamen minifiziert, window.ng existiert nicht, und Angular DevTools startet nicht. Dafür brauchst du deine eigene App, gestartet mit ng serve.
  • Elements, Network, Application, Performance Monitor und Heap Snapshots funktionieren überall. Suche nach Tags und nativen Typen, nicht nach deinen Klassennamen.
  • Ein Leak zeigt sich als Zahl, die mit jeder Wiederholung wächst und nie sinkt: JS event listeners im Performance Monitor, ein positives # Delta in Comparison.
  • DevTools selbst kann Objekte am Leben halten: was du in Elements ausgewählt oder in der Console ausgegeben hast. Leere die Console vor dem letzten Snapshot.
Warum du auf einer veröffentlichten Website nichts siehst
  • Klassennamen sind minifiziert. Ein Heap Snapshot zeigt nicht LeakyWidget, sondern e, Ge oder dc. HTML-Tags (<app-leaky-widget>) und native Browser-Typen (DOMTimer, EventListener) bleiben aber lesbar.
  • Die ng.*-Hilfsfunktionen in der Console gibt es nur in der Entwicklung. Auf der veröffentlichten Website ist ng undefined.
  • Angular DevTools funktioniert nicht mit Production-Builds. Es zeigt „We detected an application built with production configuration. Angular DevTools only supports development builds.“
  • Die HTTP-Beispiele dieser Website nutzen ein im Browser simuliertes Backend. Ihre Requests erscheinen nie in Network. Das Labor unten schickt einen echten Request, damit du etwas verfolgen kannst.

DevTools öffnen und jedes Panel finden

  • DevTools öffnest du mit F12 oder Ctrl+Shift+I (Windows, Linux) bzw. Cmd+Option+I (Mac). Oder Rechtsklick auf die Seite → Inspect (Untersuchen).
  • Die Panels sind Tabs oben: Elements, Console, Sources, Network, Performance, Memory, Application. Was nicht passt, liegt unter ».
  • Der schnellste Weg zu allem ist das Befehlsmenü, mit Ctrl+Shift+P bzw. Cmd+Shift+P. Tippe „memory“ und wähle Show Memory, oder „performance monitor“ und wähle Show Performance monitor.
  • Esc öffnet und schließt die untere Drawer-Leiste mit der Console. So siehst du die Console neben jedem anderen Panel.

Auf dieser Seite üben

Lass DevTools neben der Seite offen. Jede Karte sagt, was du hier drückst und was du dort suchst.

LiveVier Übungen für Elements, Console, Network und Application

Elements

Klicke auf das Inspect-Symbol in der DevTools-Ecke (oder Ctrl+Shift+C / Cmd+Shift+C) und dann auf den grauen Text neben dem Button. Drücke danach ein paarmal +1: In Elements blinkt das Attribut data-clicks bei jeder Änderung.

data-clicks="0"

Console

Drücke den Button und tippe dann atlas in das Feld Filter der Console. Klicke auf den Pfeil vor dem Objekt, um es aufzuklappen.

Network

Wähle in Network den Filter Fetch/XHR und drücke den Button. Eine Zeile robots.txt?atlas-lab=1 erscheint. Klicke sie an und sieh dir Headers, Response und Timing an.

Stell das Throttling auf Slow 4G und sende erneut: Die Zeit steigt, und Timing zeigt, wohin sie geht.

Application

Speichere einen Text und öffne dann Application → Storage → Local storage → die Adresse der Website. Doppelklicke auf den Wert des Schlüssels atlas-devtools-lab, ändere ihn und drücke Erneut lesen.

Was jetzt in localStorage steht: null

Dort liegt auch der Schlüssel atlas-progress: dein Fortschritt durch die Lektionen, nur in deinem Browser gespeichert.

Alle funktionieren auch auf der veröffentlichten Website: Nichts hängt von Klassennamen ab.

Elements: was Angular gerendert hat

Elements zeigt das DOM, wie es jetzt ist, nicht das HTML, das der Server geschickt hat. Ein paar Dinge, die Angular darin hinterlässt:

  • Das Wurzelelement (<app-root>) trägt ein Attribut ng-version mit der exakten Angular-Version. Auf dieser Website: 22.2.2.
  • Die Attribute _nghost-ng-c… und _ngcontent-ng-c… stammen aus der Style-Kapselung (Modus Emulated). Im Bereich Styles rechts sehen Selektoren aus wie .btn[_ngcontent-ng-c…].
  • Die leeren Kommentare <!----> sind Angulars Anker für @if, @for und @defer: die Stelle, an der es Inhalt einfügt oder entfernt.
  • Das ausgewählte Element ist in der Console als $0 verfügbar. Attribute und Text, die sich ändern, blinken in Elements kurz auf: So siehst du, was Angular aktualisiert.

Console: die ng-Hilfsfunktionen (nur Entwicklung)

In deiner eigenen App, gestartet mit ng serve, legt Angular ein globales Objekt ng auf die Seite. Wähle ein Element in Elements und dann in der Console:

// Elements: Element auswählen; in der Console ist es $0 (nur Entwicklung)
ng.getComponent($0)          // die Komponente, deren Host $0 ist
ng.getOwningComponent($0)    // die Komponente, in deren Template $0 steht
ng.getDirectives($0)         // die Direktiven auf $0
ng.getInjector($0)           // der Element-Injector: .get(EinService)
ng.getListeners($0)          // die Listener, die Angular auf $0 gesetzt hat
ng.getRootComponents()       // die Root-Komponenten

const c = ng.getComponent($0);
c.count.set(42);             // ein Signal wird direkt geschrieben; Angular rendert selbst
c.title = 'Test';            // eine einfache Property braucht applyChanges
ng.applyChanges(c);

In einem Production-Build gibt es diese Funktionen nicht. Das ist kein Fehler: Sie werden absichtlich entfernt, damit sie die App nicht belasten.

Network: was die App anfragt

Network zeichnet nur auf, solange es geöffnet ist. Öffnest du es nach dem Laden der Seite, lade die Seite neu.

  • Die Filter oben (Fetch/XHR, JS, CSS, Img …) und das Textfeld lassen nur die Requests übrig, die dich interessieren.
  • Klicke auf einen Request: Headers (URL, Status, Header), Payload (was du geschickt hast), Preview und Response (was zurückkam), Initiator (welcher Code ihn gestartet hat), Timing (wohin die Zeit ging).
  • Keep log (in älteren Versionen: Preserve log) behält die Liste bei Navigation und Neuladen. Disable cache umgeht den Cache, solange DevTools offen ist.
  • Das Menü Throttling simuliert ein langsameres Netz: Fast 4G, Slow 4G, 3G oder Offline. So siehst du Skeletons, Ladezustände und was ohne Netz passiert.

Application: was die App im Browser speichert

  • Storage → Local storage / Session storage → die Adresse der Website: Schlüssel und Werte, die du bearbeiten oder löschen kannst.
  • Cookies, IndexedDB und Cache storage liegen am selben Ort. Im Cache storage hält ein Service Worker die Dateien für offline.
  • Der Bereich Service workers zeigt den aktiven Worker. Update on reload erzwingt die neue Version bei jedem Neuladen, Bypass for network umgeht ihn. Beides ist praktisch, während du daran arbeitest.
  • Storage → Clear site data löscht alles, was die Website gespeichert hat. Der sicherste Weg, einen „ersten Besuch“ zu testen.

Performance Monitor: der schnelle Check

Vor jedem Snapshot: Schau dir Live-Zahlen an.

  1. Befehlsmenü (Ctrl/Cmd+Shift+P) → „performance monitor“ → Show Performance monitor. Er öffnet sich unten in der Drawer-Leiste.
  2. Beobachte JS heap size, DOM nodes und JS event listeners. Ein Klick auf einen Namen blendet seinen Graphen ein oder aus.
  3. Drücke im Labor unten, mit abgewählten Fixes, 10-mal öffnen und schließen. JS event listeners steigt um 10 und bleibt dort. Drücke Zombies aufräumen: Der Wert sinkt wieder. Mit allen Fixes aktiviert steigt er gar nicht.

Memory: ein Leak, Schritt für Schritt gefunden

Das Labor aus der Lektion über Memory Leaks, hier, damit du etwas zu messen hast. Jedes Widget, das mit abgewählten Fixes geschlossen wird, hinterlässt einen Timer, einen Listener und eine Subscription, die die Komponente im Speicher halten.

LiveWidgets, die Speicher verlieren
Beim Destroy schließen:

Kein Widget auf der Seite.

zerstört, noch am Leben
0
gehaltener Speicher
0.00 MB
Zombie-Arbeit
0/s
Subscriptions
0
Timer
0
Listener
0
erstellte Widgets
0
Fixes abwählen, 10-mal öffnen und schließen drücken, dann den Schritten unten folgen.

Heap Snapshot und Comparison

  1. Öffne das Panel Memory. Wähle unter Select profiling type den Eintrag Heap snapshot.
  2. Klicke auf das Papierkorb-Symbol, Collect garbage, dann auf Take snapshot. Links erscheint Snapshot 1.
  3. Drücke auf der Seite, mit abgewählten Fixes, 10-mal öffnen und schließen und warte, bis es fertig ist.
  4. Wieder Collect garbage und Take snapshot: Snapshot 2 erscheint.
  5. Stelle bei ausgewähltem Snapshot 2 das erste Menü in der oberen Leiste von Summary auf Comparison. Das Menü daneben zeigt, womit du vergleichst: Snapshot 1.
  6. Tippe einen Namen aus der Tabelle unten in Filter by class und sieh dir die Spalten # New und # Delta an.
  7. Drücke Zombies aufräumen, nimm Snapshot 3 auf und vergleiche ihn mit Snapshot 2: Dieselben Zeilen stehen jetzt unter # Deleted.
Filter by class# DeltaWas es bedeutet
app-leaky-widget+10Die Host-Elemente der 10 Widgets, aus der Seite entfernt, aber noch im Speicher gehalten. Auch auf der veröffentlichten Website sichtbar.
DOMTimer+10Die 10 setInterval, die noch laufen. Ein nativer Browser-Typ, daher bleibt der Name auch in Produktion lesbar.
EventListener+10Die Listener auf document, die nie entfernt wurden.
LeakyWidget+10Die Komponentenklasse. Erscheint nur in der Entwicklung (meist als _LeakyWidget). In Produktion ist der Name minifiziert, dort suchst du nach dem Tag.

Wer das Objekt hält: Retainers

Klappe eine Zeile auf und klicke auf eine Instanz. Der Bereich Retainers unten zeigt, wer sie am Leben hält: Die oberen Zeilen sind die direkten Referenzen, und beim Aufklappen gehst du die Kette hinauf zu etwas Langlebigem (Window, ein Listener, ein Timer). Die Spalte Distance sagt, wie viele Schritte es bis window sind. Das Leak ist das Glied, das dein Code beim Destroy hätte trennen sollen.

Direkter: Detached elements

  1. Wähle in Memory → Select profiling type den Eintrag Detached elements.
  2. Wiederhole die Aktion auf der Seite und drücke dann Get detached elements.
  3. Die Liste zeigt Elemente, die aus der Seite entfernt, aber noch von JavaScript referenziert werden. Hier: ein <app-leaky-widget> pro geschlossenem Widget.
Auch DevTools hält Objekte am Leben
Ein Element, das du in Elements ausgewählt hast, ein Objekt, das du mit console.log ausgegeben hast, oder ein Ergebnis in der Console bleiben im Speicher, solange DevTools sie braucht. Zeigt ein Snapshot nach dem Aufräumen immer noch Objekte, leere die Console (das Symbol mit dem durchgestrichenen Kreis, oder Ctrl+L, auf dem Mac Cmd+K), wähle ein anderes Element und wiederhole. In Summary zeigt der Filter Objects retained by DevTools Console genau diese Objekte.

Performance: was über die Zeit passiert

  • Record zeichnet auf, während du etwas auf der Seite tust. Record and reload lädt die Seite neu und zeichnet den Start auf.
  • Aktiviere Show memory timeline, um JS Heap, Dokumente, Knoten und Listener auf derselben Achse zu sehen. Ein Leak sieht aus wie eine Treppe, die steigt und nie sinkt.
  • In der Entwicklung kann Angular eine eigene Spur Angular mit Komponenten, Change Detection und Hooks ergänzen. Du schaltest sie mit ng.enableProfiling() in der Console ein, vor Record.
// in der Console, in deiner mit ng serve gestarteten App:
ng.enableProfiling();

// oder in main.ts, um auch den Start zu erfassen:
import { enableProfiling } from '@angular/core';

enableProfiling();
bootstrapApplication(App, appConfig);

Angular DevTools

Die Erweiterung sieht die App so, wie Angular sie sieht: Komponenten, Inputs, Signals, Injectoren, Routen.

  1. Installiere Angular DevTools aus dem Chrome Web Store (es gibt auch eine Firefox-Version).
  2. Starte deine App mit ng serve, öffne DevTools und suche den Tab Angular, eventuell unter ». Auf der Seite „Neuer Tab“ des Browsers laufen keine Erweiterungen.
  3. Bei einem Production-Build, auch auf dieser Website, siehst du nur die Meldung „We detected an application built with production configuration“. Das ist normal.
TabWas du siehst
ComponentsDer Baum der Komponenten und Direktiven, einschließlich @defer-Blöcken. Klicke auf eine Komponente: Inputs, Outputs und Properties rechts. Rechtsklick auf einen Wert, um ihn zu bearbeiten.
ProfilerJeder Change-Detection-Zyklus als Balken; je höher, desto länger hat er gedauert. Gestartet wird mit dem Kreis oben links (Start recording). Die Checkbox Change detection zeigt, welche Komponenten tatsächlich geprüft wurden.
Injector TreeDie Hierarchie der Environment- und Element-Injectoren und der Weg, den eine Abhängigkeitssuche nimmt (Angular 17+).
Router TreeDer Routenbaum: Pfad, Komponente, Guards, Resolver, lazy oder nicht, welche aktiv ist.
  • $ng0 in der Console ist die gerade in Angular DevTools ausgewählte Komponente, $ng1 die davor.
  • Das Inspect-Symbol in der Ecke der Erweiterung: Fahre mit der Maus über die Seite und sieh, welche Komponente dort ist.
  • Ein Doppelklick auf eine Komponente bringt dich zu ihrem Element in Elements; das Symbol oben rechts zu ihrem Quellcode in Sources.
  • Show Signal Graph im Kopf des Property-Bereichs zeichnet die Signals, Computeds und Effects der Komponente und wer wen liest (Angular 19+). Gib ihnen einen debugName, damit sie lesbare Namen haben.

Die üblichen Quellen von Leaks und wie du jede schließt, findest du unter Memory Leaks. Was du tust, wenn du gefunden hast, was langsam ist: Performance und Change Detection.

Häufige Stolperfallen

  • Du suchst in einem Production-Build nach deinem Klassennamen. Er ist nicht da: Suche nach Tag oder nativem Typ, oder starte die App mit ng serve.
  • Snapshots vergleichen ohne vorher Collect garbage: Der Heap steigt und fällt von selbst, kleine Unterschiede bedeuten nichts.
  • Die Aktion nur einmal wiederholen. Ein Leak ist eine Zahl, die bei jeder Wiederholung um denselben Schritt wächst. Wiederhole 10-mal und suche nach +10.
  • Network erst nach dem Laden öffnen und glauben, es sei nichts angefragt worden. Network zeichnet nur auf, solange es offen ist: Lade die Seite neu.

Spickzettel

F12 · Ctrl+Shift+I · Cmd+Option+I            DevTools öffnen
Ctrl+Shift+C · Cmd+Shift+C                   ein Element auf der Seite auswählen
Ctrl+Shift+P · Cmd+Shift+P                   das Befehlsmenü
Esc                                          die Drawer-Leiste mit der 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

nur Entwicklung:
  ng.getComponent($0) · ng.applyChanges(c) · ng.enableProfiling()
  Angular DevTools: Components · Profiler · Injector Tree · Router Tree · $ng0

Kap. 11 · 0 von 4 abgeschlossen

Lektion abgeschlossen?

Markiere sie, dann erscheint sie auf deiner Karte: im Inhaltsverzeichnis und auf der Startseite.

Wird automatisch markiert, sobald du die ganze Lektion gelesen hast.

  1. Performance — eine Checkliste
  2. Testen mit Vitest
  3. DevTools: ein Blick in deine App
  4. Angular Aria
Deine ganze Karte ansehen

Alle 75 Seiten · tippen zum Filtern

  • 01Was ist neu in Angular 21 & 22Alle wichtigen Änderungen in v21 und v22 in Kürze, mit Link zur Seite, die sie jeweils erklärt.Start
  • 01Deine erste App, Schritt für SchrittEine Leseliste, von einer leeren Komponente bis zur fertigen App — Signals, @for, Inputs und Outputs, ein Service und ein Formular, Schritt für Schritt.Start
  • 01Schnelle Entscheidungen„Wohin damit?“, „Signal oder Observable?“, „Shared oder Feature?“ — kurze Antworten auf Alltagsfragen.Start
  • 01Angular-Interviewfragen60 echte Interviewfragen für Junior, Mid und Senior, mit der passenden Antwort, der Nachfrage und den Warnsignalen. Dazu ein Probeinterview.Start
  • 02Standalone & BootstrapWie eine App ohne NgModule startet: bootstrapApplication, app.config.ts, imports in der Komponente.Moderne Grundlagen
  • 02Data Binding & EventsInterpolation, Property- und Attribut-Bindings, Events mit $event und Tastenfiltern und wie [( )] aufgebaut ist — was in das DOM geht und was zurückkommt.Moderne Grundlagen
  • 02Control Flow: @if, @for, @switchDie Block-Syntax, die *ngIf/*ngFor/ngSwitch ersetzt, mit track, @empty und Exhaustive Checks.Moderne Grundlagen
  • 02@let und die neuen Template-AusdrückeLokale Variablen mit @let, Arrow Functions, Spread, Regex, instanceof, Kommentare in Tags.Moderne Grundlagen
  • 02@defer — Lazy Loading in TemplatesSchwere Komponenten nur laden, wenn sie gebraucht werden: Trigger, Prefetch, Placeholder, Loading, Error.Moderne Grundlagen
  • 02Class- & Style-BindingsWarum [class.x] und [style.x] ngClass und ngStyle abgelöst haben (mit automatischer Migration ab v21).Moderne Grundlagen
  • 02Komponenten-Styles & Kapselung:host, die drei Kapselungsmodi, Theming mit CSS-Variablen und warum ::ng-deep der letzte Ausweg ist.Moderne Grundlagen
  • 02Pipes: wann und wiePure vs. Impure Pipes, eigene Pipes und wie du zwischen Pipe, computed() und Methode wählst.Moderne Grundlagen
  • 03signal() und computed()Die reaktiven Grundbausteine: beschreibbarer Zustand, abgeleiteter Zustand, Gleichheit, untracked und Regeln zur Immutability.Signals & Reaktivität
  • 03effect() — wann ja, wann neinMit Signals synchronisierte Seiteneffekte: localStorage, Logging, imperative APIs. Und ihre Stolperfallen.Signals & Reaktivität
  • 03linkedSignal() — editierbarer abgeleiteter ZustandEin Signal, das sich zurücksetzt, wenn sich seine Quelle ändert, das du aber auch manuell setzen kannst.Signals & Reaktivität
  • 03resource, rxResource, httpResourceAsynchrone Daten als Signals: status, value, error, reload, automatischer Abbruch. Stabil seit v22.Signals & Reaktivität
  • 03debounced() — verzögerte SignalsDie „Debounce“-Variante eines Signals, ohne RxJS. Perfekt für die Suche.Signals & Reaktivität
  • 03Listen: suchen, filtern, sortieren, blätternEine Kette von computed-Signals, die nur neu berechnet, was sich geändert hat — mit den Filtern in der URL, damit ein Link dieselbe Ansicht öffnet.Signals & Reaktivität
  • 03Observables von null anWas ein Observable ist, subscribe und unsubscribe, die Operatoren, die du jede Woche brauchst, cold vs. hot — und wann ein Signal reicht.Signals & Reaktivität
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — und wann RxJS weiterhin die richtige Wahl bleibt.Signals & Reaktivität
  • 04input() und output()Inputs als Signals (required, transform, alias) und typisierte Outputs. Daten nach unten, Events nach oben.Komponenten: Kommunikation
  • 04model() — Two-Way-BindingBanana-in-a-Box [( )] mit einer einzigen API. Wann du es nutzt und wann input + output besser ist.Komponenten: Kommunikation
  • 04viewChild & contentChildQueries als Signals: viewChild, viewChildren, contentChild, contentChildren, die Option read.Komponenten: Kommunikation
  • 04Lifecycle & DestroyRefWelche Hooks in der Signals-Ära noch zählen, afterNextRender, DestroyRef und typisiertes ngOnChanges.Komponenten: Kommunikation
  • 04Content Projectionng-content mit select, mehrere Slots, Standardinhalt und die Falle der bedingten Projektion.Komponenten: Kommunikation
  • 04ng-template & ngTemplateOutletTemplates als Werte: Render Props in Angular, typisierter Kontext und Anpassen von Komponenten.Komponenten: Kommunikation
  • 05Smart vs. DumbContainer vs. Presentational: wer den Zustand hält, wer nur anzeigt und wie du die beiden sauber trennst.Komponenten-Design
  • 05Generische Komponenten <T>Eine korrekt typisierte DataTable<T> oder Select<T>, mit Templates für Zellen.Komponenten-Design
  • 05Dynamische KomponentenNgComponentOutlet, createComponent mit inputBinding/outputBinding und ein Dashboard, das aus einer Konfiguration gebaut wird.Komponenten-Design
  • 05Direktiven & Host-KompositionAttribut-Direktiven, die host: {}-Metadaten und die Directive Composition API (hostDirectives).Komponenten-Design
  • 05Eigene Formular-ControlsFormValueControl (Signal Forms) vs. ControlValueAccessor: eine Sternebewertung, in beiden Varianten.Komponenten-Design
  • 05Change DetectionOnPush ist ab v22 der Standard, zone.js entfällt ab v21. Was das Rendering auslöst und wie du dir nicht die Finger verbrennst.Komponenten-Design
  • 06inject() & @Service()Der neue @Service()-Decorator ab v22, inject() vs. Konstruktor und der Injection-Kontext.Dependency Injection
  • 06Provider & die Injector-HierarchieRoot vs. Route vs. Komponente, useClass/useValue/useFactory/useExisting und die Modifier optional/self/skipSelf.Dependency Injection
  • 06InjectionToken & provideX()Typisierte Konfiguration, provideFeature()-Funktionen, makeEnvironmentProviders und Initializer.Dependency Injection
  • 06injectAsync() — Lazy ServicesLade einen schweren Service erst, wenn du ihn brauchst, mit Prefetch im Leerlauf.Dependency Injection
  • 07Ordnerstrukturcore / shared / features, was in welchen Ordner gehört und wie ein Feature von innen aussieht.Architektur der Anwendung
  • 07Shared vs. FeatureWann du eine Komponente nach Shared verschiebst und (vor allem) wann NICHT. Eine konkrete Checkliste.Architektur der Anwendung
  • 07Interfaces & ModelleInline-Interface oder eigene Datei? DTO vs. Domänenmodell, type vs. interface, wohin damit.Architektur der Anwendung
  • 07State Management mit SignalsEinfache Signal-Stores, Fassaden, lokaler vs. globaler Zustand und wann du NgRx brauchst.Architektur der Anwendung
  • 07Styleguide & NamensgebungDie aktuellen offiziellen Konventionen: Dateinamen ohne Suffixe, protected, readonly, Reihenfolge der Member.Architektur der Anwendung
  • 07Barrels, Aliase & Grenzenindex.ts, Pfad-Aliase, die öffentliche API eines Features und Abhängigkeitsregeln, die sich automatisch prüfen lassen.Architektur der Anwendung
  • 07Fehler: @boundary & ErrorHandlerDer neue @boundary-Block ab v22.2, der globale ErrorHandler, HTTP-Fehler und Fehler aus resource.Architektur der Anwendung
  • 08Modernes Routing & Lazy LoadingloadComponent, Child Routes, Parameter als Inputs und Parameter-Vererbung (neuer Standard in v22).Routing
  • 08Guards & ResolvercanActivate, canMatch, canDeactivate und resolve als Funktionen, mit Redirects über UrlTree / RedirectCommand.Routing
  • 09Signal Forms — die GrundlagenFormulare auf Basis von Signals: form(), [formField], schemabasierte Validierung. Stabil seit v22.Formulare
  • 09Signal Forms — fortgeschrittenEigene und feldübergreifende Validierung, async/HTTP mit Debounce, dynamische Listen, disabled/hidden, wiederverwendbare Schemas.Formulare
  • 09Typisierte Reactive FormsTypisierte FormGroup, nonNullable, FormArray — und wie sie neben Signal Forms bestehen.Formulare
  • 10HttpClient, Interceptors & die API-SchichtHttpClient ohne Setup (v21), Fetch als Standard (v22), funktionale Interceptors und eine API-Schicht mit DTO-Mapping.HTTP & Daten
  • 11Performance — eine ChecklisteWas wirklich zählt: OnPush + Signals, track, @defer, Lazy Routes, Bilder, Bundles und Hydration.Qualität & Performance
  • 11Testen mit VitestVitest ist ab v21 der Standard-Runner. TestBed, Komponenten mit Signals, Services, HTTP und Harnesses.Qualität & Performance
  • 11DevTools: ein Blick in deine AppChrome DevTools und Angular DevTools Schritt für Schritt: was jedes Panel zeigt, mit Übungen, die auf dieser Website funktionieren.Qualität & Performance
  • 11Angular AriaHeadless, barrierefreie Komponenten, die du nach Belieben stylst: Tabs, Accordion, Menü, Listbox...Qualität & Performance
  • 12SSR, Prerendering & Render ModesWann auf dem Server gerendert wird, wann beim Build und wann nur im Browser: RenderMode pro Route, app.routes.server.ts und die echten Kosten.SSR & Hydration
  • 12Hydration: Event Replay & inkrementellWie der Browser das Server-HTML übernimmt, ohne es neu zu rendern: vollständige Hydration, Event Replay, @defer (hydrate on …) und Mismatch-Fehler.SSR & Hydration
  • 12Servertauglicher Codewindow gibt es auf dem Server nicht: PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, der HTTP-Cache und PendingTasks.SSR & Hydration
  • 13Micro FrontendsWann es sich lohnt, eine App in mehrere Deployments aufzuteilen und wann es nur Komplexität ist: Native Federation, Module Federation, iframes, Web Components.Architektur im großen Maßstab
  • 13Web Components mit Angular ElementscreateCustomElement: eine Angular-Komponente, die überall als HTML-Tag nutzbar ist, plus Kommunikation zwischen Apps über Events und BroadcastChannel.Architektur im großen Maßstab
  • 13Monorepo, Bibliotheken & GrenzenEin Workspace mit mehreren Apps und Bibliotheken: ng generate library, Nx, Secondary Entry Points, Publishing und Abhängigkeitsregeln.Architektur im großen Maßstab
  • 13Hexagonale Architektur (Ports & Adapters)Eine Domäne ohne Angular, Ports als abstrakte Klassen und austauschbare Adapter: HTTP, localStorage oder In-Memory, ohne die UI anzufassen.Architektur im großen Maßstab
  • 14Signals unter der HaubeDer reaktive Graph: Producer und Consumer, Push-Pull, warum computed lazy und glitch-frei ist, das Diamond-Problem und wann Effects laufen.Fortgeschrittene Reaktivität
  • 14Fortgeschrittenes RxJS: Operatoren höherer OrdnungswitchMap, mergeMap, concatMap und exhaustMap an einem Live-Diagramm, dazu Retry mit Backoff, shareReplay und wie du Leaks vermeidest.Fortgeschrittene Reaktivität
  • 14NgRx SignalStoreState Management im großen Stil auf Signals: withState, withComputed, withMethods, rxMethod, Entities und Hooks — und wann ein einfacher Store reicht.Fortgeschrittene Reaktivität
  • 14Zustandsautomaten mit SignalsKeine unmöglichen Zustände mehr: ein typisierter Automat auf Signals, mit Übergängen, Guards und einem Live-Zustandsdiagramm.Fortgeschrittene Reaktivität
  • 15WebSockets: Echtzeit, die das Netz überstehtEin typisierter Socket als Signals: Reconnect mit Backoff und Jitter, Heartbeat, ein Postausgang im Offline-Modus und SSR-Sicherheit.Echtzeit & offline
  • 15Optimistische Updates & RollbackEine sofortige UI, die ehrlich bleibt: Snapshot und Rollback, Antworten in falscher Reihenfolge, Idempotenzschlüssel.Echtzeit & offline
  • 15Offline-first: Service Worker & CachingDer Angular Service Worker: Caching-Strategien, Update-Hinweise und ein Postausgang für Änderungen, die offline entstehen.Echtzeit & offline
  • 16Web WorkersSchwere Berechnungen, ohne die UI zu blockieren: ein echter Worker in der Seite, Message Passing und wann es sich nicht lohnt.Fortgeschrittene UI & Performance
  • 16Riesige Listen: Virtual Scroll100.000 Zeilen ohne Ruckeln: CDK Virtual Scroll, itemSize, trackBy und die Alternativen (Paginierung, Infinite Scroll).Fortgeschrittene UI & Performance
  • 16Moderne Animationen & View Transitionsanimate.enter und animate.leave statt des veralteten @angular/animations, CSS-Transitions und View Transitions bei der Navigation.Fortgeschrittene UI & Performance
  • 16Memory Leaks finden und behebenSubscriptions, Timer und Listener, die ihre Komponente überleben – wie du sie in den DevTools findest und schließt.Fortgeschrittene UI & Performance
  • 17Sicherheit: XSS, Sanitizing & CSPWas Angular automatisch gegen XSS tut, wann bypassSecurityTrust gefährlich wird, dazu CSP mit Nonce, Trusted Types und XSRF.Sicherheit & Globalisierung
  • 17Authentifizierung: Tokens & RefreshEin Interceptor, der das Token anhängt, bei 401 einmal erneuert und die wartenden Requests wiederholt — dazu, wo du das Token aufbewahrst.Sicherheit & Globalisierung
  • 17OAuth 2.1 & OpenID Connect mit PKCEDer Authorization-Code-Flow mit PKCE Schritt für Schritt: Verifier und Challenge, State und Nonce, das ID-Token und warum ein BFF sicherer ist.Sicherheit & Globalisierung
  • 17Internationalisierung (i18n)$localize, das i18n-Attribut, ICU plural/select, ein Build pro Sprache vs. Übersetzungen zur Laufzeit und Formatierung nach Locale.Sicherheit & Globalisierung