Sechs Karten auf einem Dashboard, sechs Spinner, und sie erscheinen nicht zusammen – sie erscheinen eine nach der anderen, wie Dominosteine, weil jede erst anfing, Daten zu laden, nachdem die darüberliegende fertig war. Das ist ein Wasserfall, und die Gesamtwartezeit ist nicht die langsamste Anfrage, sondern die Summe aller. use() und Suspense unterbrechen die Kette – aber das Interessanteste ist die Maschinerie darunter: Was ein suspendiertes Komponente tatsächlich wirft, und wie HTML, das nicht in der richtigen Reihenfolge ankommt, trotzdem an der richtigen Stelle landet.
Zehn Jahre lang bedeutete das Animieren einer Miniatur zu einem Hero-Bild eine einzige Technik: vor dem Element messen, danach messen, den Unterschied mit einem Transform vortäuschen und abspielen. FLIP. Jede Animationsbibliothek macht das so – und jede zahlt dafür mit JavaScript auf dem Hauptthread im denkbar schlechtesten Moment. Die View Transitions API verlagert diesen Trick in den Browser – und seit React 19.2 und Next.js 16 besteht der gesamte Vertrag aus einem einzigen Prop namens name.
„use server" wirkt wie syntaktischer Zucker für einen fetch-Aufruf an eine API-Route – und genau deshalb behandelt die Mehrheit der Umsetzungen es wie einen gewöhnlichen Funktionsaufruf. Das ist ein Fehler mit konkreten Konsequenzen: Jede mit „use server" markierte Funktion wird zu einem öffentlichen Netzwerk-Endpunkt, und ein auf diesem Mechanismus aufgebautes Formular funktioniert sogar, bevor JavaScript überhaupt geladen ist. Ich schaue mir an, was hinter dieser Direktive tatsächlich passiert, und wo Fallen lauern, die man in der Dokumentation nicht auf den ersten Blick sieht.
Korrektes HTML ist nur der Ausgangspunkt. Erfahre, wie der Accessibility Tree wirklich funktioniert, warum ARIA öfter schadet als nützt, als man denkt, und bau mit mir ein echtes Akkordeon, eine Live-Region und Next.js-Fokus-Handling.