AngularAtlasAusg. 22.2

Kap. 03Signals & Reaktivität19 / 75

Observables von null an

Was ein Observable ist, subscribe und unsubscribe, die Operatoren, die du jede Woche brauchst, cold vs. hot — und wann ein Signal reicht.

~0 Min. Lesezeit Offizielle Doku

Ein Observable ist ein Strom von Werten über die Zeit. Es kann nichts, einen einzigen Wert oder eine endlose Folge ausgeben und endet mit complete oder error — oder nie. In Angular begegnet es dir überall, wo Events passieren: HttpClient, Router-Events, valueChanges in Reactive Forms, WebSockets.

Signals haben die Aufgabe übernommen, Zustand zu halten; Observables bleiben das Werkzeug für Events in der Zeit — Klicks, Tastendrücke, Antworten, die man abbrechen kann. Diese Seite deckt ab, was du vor Signals und RxJS und RxJS für Fortgeschrittene brauchst.

Warum das wichtig ist
Die meisten RxJS-Bugs kommen aus zwei Missverständnissen: dass ein Observable von selbst läuft, und dass sich alle Subscriber eine Ausführung teilen. Wenn du beides einmal live gesehen hast, ist der Rest von RxJS eine Liste von Operatoren.

Anatomie eines Observables

Ein Observable ist eine Funktion, die darauf wartet, aufgerufen zu werden. new Observable(subscriber => …) speichert sie; jedes subscribe() ruft sie mit einem neuen Subscriber auf, der Werte über next() und das Ende über error() oder complete() bekommt. Die Funktion gibt ein Teardown zurück: was gestoppt werden muss, wenn sich jemand abmeldet.

import { Observable } from 'rxjs';

// die Funktion läuft bei JEDEM subscribe(), nicht hier
const ticker$ = new Observable<number>((subscriber) => {
  let n = 0;
  const id = setInterval(() => subscriber.next(++n), 1000);

  // Teardown: läuft bei unsubscribe(), complete() oder error()
  return () => clearInterval(id);
});

Lazy, und eine Ausführung pro Subscriber

Wenn du ein Observable erzeugst, passiert nichts — nicht einmal ein HTTP-Request. Die Arbeit beginnt bei subscribe(), und jeder Subscriber bekommt seine eigene Ausführung: zwei Subscriber auf http.get() bedeuten zwei Requests. So ein Observable nennt man cold.

LiveEin handgeschriebener Ticker: wer ihn startet, wer ihn stoppt
Höchstens vier Subscriber.

Keine Subscriber: Das Observable existiert, aber nichts läuft.

Subscriber
0
Laufende Ausführungen
0
Gestartete Ausführungen
0
Im Inneren des Observables
  1. Noch nichts ist gelaufen.
Abonniere zwei- oder dreimal und vergleiche die Werte und die Nummern der Ausführungen. Melde dich ab und probier dann share() und shareReplay.

Ohne Teilen startet jeder Subscriber sein eigenes setInterval: Die Werte unterscheiden sich, und die Zahl der laufenden Ausführungen wächst. share() macht den Strom hot: eine Ausführung, deren Werte an alle gehen, gestoppt, wenn der letzte Subscriber geht. shareReplay({ bufferSize: 1, refCount: true }) gibt zusätzlich jedem, der später kommt, den letzten Wert — ein neuer Subscriber zeigt kein „…“ mehr.

const user$ = this.http.get<User>('/api/user'); // noch wird nichts gesendet

user$.subscribe(); // Request 1
user$.subscribe(); // Request 2 — jeder Subscriber bekommt seine eigene Ausführung

// ein Request, geteilt von allen, die abonnieren, solange er läuft
const shared$ = user$.pipe(shareReplay({ bufferSize: 1, refCount: true }));

Operatoren: pipe() baut einen neuen Strom

Ein Operator nimmt ein Observable und gibt ein anderes zurück; die Quelle ändert sich nicht. pipe() verkettet sie von oben nach unten, und jeder Wert läuft durch die ganze Kette, bevor der nächste startet.

LiveOperatoren wählen, Werte ausgeben, zusehen, wie sie durchlaufen
source$.pipe(
  filter((n) => n % 2 === 0),
  map((n) => n * 10),
).subscribe({ next, error, complete });
Ausgegeben
0
Empfangen
0
Letzter Wert
—
Abo
offen
Drücke next(1)…next(4) und Salve. Setz dann ein Häkchen bei debounceTime, take(3) oder scan und beobachte die untere Linie. Nach complete() oder error() drückst du Neustart.

Ein paar Dinge zum Beobachten. filter und take entscheiden, ob ein Wert durchkommt; map und scan verändern ihn; debounceTime hält einen Wert zurück, bis die Quelle 500 ms still war — aus der Salve wird ein einziger Wert. take(3) beendet den Subscriber, obwohl die Quelle weiterläuft. Und nach complete() oder error() ist die Quelle endgültig fertig: Es kommt nichts mehr durch.

import { debounceTime, distinctUntilChanged, filter, map } from 'rxjs';

const query$ = this.searchControl.valueChanges.pipe(
  map((text) => text.trim()),
  filter((text) => text.length >= 2), // nicht für einen Buchstaben
  debounceTime(300), // warten, bis das Tippen pausiert
  distinctUntilChanged(), // dieselbe Suche nochmal: überspringen
);

Die Operatoren, die du jede Woche brauchst

OperatorWas er tutTypischer Einsatz
mapverwandelt jeden Wertein Feld aus einer Antwort holen
filterlässt nur passende Werte durchleere Suchen ignorieren
tapein Seiteneffekt; der Wert geht unverändert weiterLogging, Analytics
debounceTime(ms)wartet auf eine Pause und gibt dann den letzten Wert ausSuche beim Tippen
distinctUntilChanged()verwirft einen Wert, der gleich dem vorigen istdieselbe Suche zweimal hintereinander
scanein laufender Zustand aus allen WertenSummen, Zähler
take(n) / first()n Werte, dann completeder erste Klick, ein einmaliger Wert
catchErrorersetzt einen Fehler durch einen anderen Stromeine Meldung zeigen, statt kaputtzugehen
switchMapmacht aus jedem Wert einen neuen Strom und bricht den vorigen abSuche → HTTP (siehe RxJS für Fortgeschrittene)

Wer meldet sich ab?

Ein Observable, das endet — ein HTTP-Request —, räumt selbst auf. Eines, das nie endet — interval, ein WebSocket, Router-Events —, läuft weiter, bis sich jemand abmeldet. In Angular rufst du unsubscribe() selten selbst auf: Die async-Pipe und toSignal() tun es, wenn die Komponente zerstört wird, und takeUntilDestroyed() tut es für ein subscribe() in der Klasse. Was passiert, wenn es niemand tut, steht unter Memory Leaks.

// 1. im Template: die async-Pipe meldet sich ab, wenn die Komponente zerstört wird
// <p>{{ ticker$ | async }}</p>

// 2. als Signal: genauso, und es liest sich wie jedes andere Signal
readonly tick = toSignal(ticker$, { initialValue: 0 });

// 3. ein subscribe() in der Klasse: an die Lebensdauer der Komponente binden
constructor() {
  ticker$.pipe(takeUntilDestroyed()).subscribe((n) => this.log(n));
}

Subject und BehaviorSubject

Ein Subject ist ein Observable, in das du selbst Werte mit next() schiebst — praktisch, um Callbacks in einen Strom zu verwandeln. Ein BehaviorSubject merkt sich zusätzlich den letzten Wert. Für Zustand in einer Komponente oder einem Service erledigt ein Signal die Aufgabe des BehaviorSubjects mit weniger Code; behalte Subjects für Events.

// ein Subject: du schiebst die Werte hinein
const clicks$ = new Subject<MouseEvent>();
button.addEventListener('click', (e) => clicks$.next(e));

// ein BehaviorSubject merkt sich den letzten Wert…
const user$ = new BehaviorSubject<User | null>(null);
user$.getValue();

// …aber für Zustand ist ein Signal einfacher
readonly user = signal<User | null>(null);

Signal oder Observable?

FrageSignalObservable
Gibt es immer einen aktuellen Wert?janicht unbedingt
Zeit: debounce, retry, abbrechen?neinja, mit Operatoren
Musst du dich abmelden?neinja, bei endlosen Strömen
Im Templatecount()obs$ | async, toSignal()

Die übliche Form in Angular 22: Observables an den Rändern (HTTP, Sockets, DOM-Events), mit toSignal() in Signals verwandelt, sobald sie eine Komponente erreichen. Mehr dazu in Signals und RxJS.

@Component({
  template: `
    @if (user(); as u) {
      <h2>{{ u.name }}</h2>
      <p>{{ u.email }}</p>
    }
  `,
})
export class Profile {
  private readonly http = inject(HttpClient);
  // das Observable bleibt am Rand; die Komponente liest ein Signal
  readonly user = toSignal(this.http.get<User>('/api/user'));
}

Häufige Stolperfallen

  • Das Abonnieren vergessen. this.http.post(…) ohne subscribe() sendet nichts.
  • Zwei async-Pipes auf demselben HTTP-Observable. Zwei Requests. Wandle es einmal mit toSignal() um oder lies es einmal mit @let.
  • subscribe() in subscribe(). Verschachtelte Abos lassen sich nicht gemeinsam abbrechen und laufen durcheinander. Nimm switchMap und seine Geschwister — siehe RxJS für Fortgeschrittene.
  • Ein endloser Strom ohne Ausgang. interval läuft weiter, wenn die Komponente schon weg ist. Nimm takeUntilDestroyed() oder toSignal().
  • shareReplay(1) ohne refCount. Die Quelle läuft weiter, auch wenn alle Subscriber gegangen sind.

Spickzettel

Observable             eine Funktion, die bei jedem subscribe() läuft; gibt 0..∞ Werte aus, dann complete oder error
lazy                   Erzeugen tut nichts; subscribe() startet die Arbeit (sogar einen HTTP-Request)
cold                   eine Ausführung pro Subscriber: zwei Subscriber = zwei Requests
share()                eine Ausführung für alle; stoppt, wenn der letzte Subscriber geht
shareReplay(…)         wiederholt auch den letzten Wert; immer { bufferSize: 1, refCount: true }
pipe(a, b, c)          ein neuer Strom; Werte laufen durch a, dann b, dann c
Teardown               die Funktion, die new Observable(…) zurückgibt; läuft bei unsubscribe
Abmelden               async-Pipe, toSignal(), takeUntilDestroyed(); HTTP endet von selbst
Subject                du rufst next() selbst auf; BehaviorSubject behält auch den letzten Wert
Signal vs. Observable  ein Wert jetzt vs. Events über die Zeit; toSignal() an der Komponentengrenze

Kap. 03 · 0 von 8 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. signal() und computed()
  2. effect() — wann ja, wann nein
  3. linkedSignal() — editierbarer abgeleiteter Zustand
  4. resource, rxResource, httpResource
  5. debounced() — verzögerte Signals
  6. Listen: suchen, filtern, sortieren, blättern
  7. Observables von null an
  8. Signals ↔ RxJS
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