# # Frontend als clientseitiger REST-Server: Architekturdiziplin statt State-Management-Chaos
Die moderne Frontend-Entwicklung hat die Phase der DOM-Manipulationen und einfachen Layouts längst hinter sich gelassen. Architekturmäßig erledigen SPA- und SSR-Anwendungen dieselbe Aufgabe wie klassische Serversysteme: Sie nehmen eingehende Signale auf, verarbeiten Daten nach den Regeln der Geschäftslogik und liefern eine fertige Ansicht zurück. Der Unterschied liegt nur im Ausführungsmedium und im Interaktionsprotokoll. Statt für jede Framework-Veröffentlichung endlos neue Abstraktionen zu erfinden, ist es effektiver, bewährte Servermuster direkt auf den Client-Code anzuwenden.
Evolution der Rolle: Von Hypermedia zur Clientseitigen Darstellung
Ursprünglich funktionierte das Web nach einem transparenten Schema: Der Browser forderte eine URL an, der Server generierte HTML, und der Client zeigte das Ergebnis an. Überraschenderweise ist standardmäßiges HTML eine native Umsetzung des HATEOAS-Prinzips. Der Server liefert nicht nur Daten, sondern den Interface-Zustand mitsamt verfügbaren Übergängen: Links, Formulare mit angegebenen Methoden, Aktionsknöpfe. Der Client speichert keine Routenkarte im Voraus – er reagiert auf das, was im aktuellen Kontext erlaubt ist.
Der moderne Ansatz mit JSON-APIs hat nur das Format der Zustandsübertragung geändert, nicht aber deren Wesen. Dasselbe Prinzip lässt sich im HAL-Format ausdrücken:
{
"id": 42,
"status": "pending",
"_links": {
"self": { "href": "/orders/42" },
"cancel": { "href": "/orders/42/cancel", "method": "POST" },
"detail": { "href": "/orders/42/detail" }
}
}
Die Formel UI = f(state) gab es lange vor der Erfindung des virtual DOM. Früher wurde der Zustand vollständig vom entfernten Server übertragen; heute wird er lokal berechnet und inkrementell aktualisiert. Das Problem entstand nicht durch den Paradigmenwechsel, sondern durch den Verlust der architektonischen Disziplin beim Portieren der Logik auf den Client.
Events als Requests: Abbildung der Architekturebenen
In der Backend-Entwicklung sind Interaktionen streng geregelt. Der Controller nimmt eine HTTP-Request an, validiert Eingabedaten, wandelt sie in ein DTO um und delegiert die Verarbeitung an die Service-Schicht. Der Service arbeitet mit dem Domain-Model, während das Repository für die Persistenz zuständig ist. Die Verantwortlichkeitsgrenzen sind klar und unabhängig von der spezifischen Sprache oder dem Framework.
Im Frontend dienen Benutzeraktionen (Klicks, Eingaben, Scrollen, WebSocket-Nachrichten) als vollständiges Analogon zu HTTP-Requests. Event = Request. Statt einheitlicher Controller hat das Ökosystem jedoch einen Zoo an Begriffen hervorgebracht: stores, composables, hooks, atoms, runes, view models. Jedes Tool bringt seine eigene State-Management-Philosophie mit, die architektonische Grenzen verwischt. Logischer ist es, die Client-Architektur an Serverstandards auszurichten:
Frontend
웃 → Event → Controller → Service → Repository → → → → → → Rest API
│ │ │ ↑ │ │
│ │ │ │ └─ Builds HTTP Request │
│ │ │ │ │
│ │ │ └─ Business logic │
│ │ │ │
│ │ └─ Extracts, validates & maps to DTO │
│ │ │
│ └─ Environment detail - Browser Event │
│ │
│ │
│ │
└─ ← Response ← Controller ← Service ← Repository ← ← ← ← ← ← Rest API
│ │ │
│ │ └─ Maps to Domain Model
│ │
│ └─ Maps to framework format: JSX/Vue template
│
└─ Automatically mapped to HTML chunk from JSX by framework
State-Behaftete Controller und Infrastrukturdetails
Die Hauptbedenken gegen das direkte Übertragen von Servermustern betreffen den Zustand. Klassische REST-Controller sind für Skalierbarkeit stateless ausgelegt. Frontend arbeitet per Definition in einem statefulen Kontext: Benutzersitzung, lokaler Cache, Form- und UI-Elementzustände leben im Browser-Speicher. Das ist kein Widerspruch, sondern eine Umgebungsmerkmal. Im Backend werden ähnliche statefule Muster in der Spieleentwicklung, IoT-Gateways und Streaming-Diensten auf gRPC- oder WebSocket-Basis verwendet.
Hooks, signals und reaktive atoms sollten rein als Infrastrukturdetails betrachtet werden. Es handelt sich um Mechanismen, die das Framework für effiziente DOM-Updates und Abhängigkeitsverfolgung nutzt. Der Fehler liegt darin, dass Entwickler Geschäftsregeln und Validierungslogik direkt in diese Primitiven packen. State-Manager kaschieren oft undichte Abstraktionen und erlauben UI-Komponenten, direkt von der Store-Struktur abzuhängen. Ein Controller und eine Service-Schicht lösen das, indem sie die Geschäftslogik vom reaktiven System des Frameworks isolieren.
Praktische Anwendung der Serverdisziplin
Das Übernehmen von Backend-Ansätzen erfordert nicht, React, Vue oder Solid aufzugeben. Es geht um die Strukturierung des Codes innerhalb des Ökosystems. Um Vorhersagbarkeit zu erreichen und die Einarbeitung neuer Entwickler zu erleichtern, genügen ein paar Prinzipien:
- Strenge Validierung eingehender Events und API-Daten an der App-Grenze (mit Zod, Yup oder TypeScript-Guards).
- Umwandlung roher Serverantworten und Benutzereingaben in DTOs, bevor sie an die Geschäftslogik weitergeleitet werden.
- Isolierung der Domain-Logik in reinen Services, die keine Framework-Hooks importieren und nichts vom DOM wissen.
- Verwendung von Repositories zur Abstraktion über Datenquellen (LocalStorage, IndexedDB, REST, GraphQL).
- Controller als einzige Verbindungsebene: Sie wandeln Events in Service-Aufrufe um und Ergebnisse in Props für Präsentationskomponenten.
Dieser Ansatz macht den Code framework-unabhängig. Geschäftslogik lässt sich leicht mit Unit-Tests abdecken, ohne Renderer-Mocks, und ein Wechsel von einer UI-Lösung zur anderen betrifft nur eine dünne Adapter-Schicht.
Wichtige Erkenntnisse
- Eine Frontend-App ist architekturmäßig äquivalent zu einem REST-Server, der im Browser läuft: Events ersetzen HTTP-Requests, und das Rendering bildet die Response.
- HTML hat historisch HATEOAS-Prinzipien umgesetzt und Zustand sowie verfügbare Aktionen gleichzeitig an den Client geliefert.
- Die Vielfalt an Begriffen (stores, composables, atoms) erzeugt den Anschein von Neuheit, verwischt aber oft Verantwortlichkeitsgrenzen und erschwert die Wartung.
- Hooks und Signals sind Framework-Infrastrukturprimitiven, keine Orte für Geschäftsregeln oder komplexe Validierungen.
- Die Anwendung von Serverdisziplin (DTOs, Controller, Services, Repositories) reduziert Code-Kopplungen, vereinfacht Tests und macht die Architektur unabhängig von spezifischen UI-Frameworks.
— Editorial Team
Noch keine Kommentare.