Ein Frontend-Team hat eine typsichere API-Mocking-Schicht eingeführt, die nur in der Entwicklung existiert. Durch den Einsatz von Axios-Interceptoren und Vite's Tree-Shaking bleibt das Produktions-Bundle unberührt. Entwickler rufen Daten mit ihren üblichen Mustern ab, während sie auf Backend-Endpunkte warten, und schalten dann einfach ein einzelnes Environment-Flag um, um die echte API aufzurufen.
Warum das Team einen besseren Weg zum Mocking brauchte
Frontend-Entwickler stoßen auf Hindernisse, wenn eine Backend-Route noch nicht fertiggestellt ist. Die schnelle Lösung – das Hardcoden einer Antwort innerhalb einer Komponente oder das Verstreuen von if (process.env.NODE_ENV === 'development')-Blöcken im gesamten UI – hält die App zwar in Bewegung, hinterlässt aber technische Schulden. Diese Mock-Objekte werden Teil der Logik der Komponente, erhöhen das Risiko, Fake-Daten in die Produktion zu bringen, und machen den Code schwerer lesbar und testbar.
Das Team wollte jeden Mock aus dem Komponentenbaum auslagern, einen Vertrag (Contract) zwischen Front- und Backend erzwingen und garantieren, dass nichts Zusätzliches im Produktions-Build landet.
Der dreistufige Prozess, dem das Team folgt
- Contract Meeting – Frontend- und Backend-Entwickler setzen sich zusammen und listen jede Anfrage, ihre URL, Methode und den erwarteten Payload auf.
- Typisierter Vertrag – Sie wandeln die Liste in ein TypeScript-Interface um, das als Single Source of Truth für die Struktur von Requests und Responses dient.
- Interceptor-Anbindung – Ein Axios-Interceptor untersucht jede ausgehende Anfrage. Wenn die URL mit einem registrierten Mock übereinstimmt, gibt der Interceptor die Mock-Daten zurück; andernfalls wird die Anfrage an den Live-Server weitergeleitet.
Da der Interceptor die einzige Stelle ist, an der die Mock-Logik lebt, bleibt der Komponenten-Code unverändert. Entwickler nutzen weiterhin ihre normalen Data-Fetching-Hooks – wie etwa useQuery – ohne zusätzliche bedingte Logik hinzuzufügen.
So wird ein Aufblähen der Produktion vermieden
Das Team hat drei Schutzmechanismen implementiert, die es Rollup (dem von Vite verwendeten Bundler) ermöglichen, den Mock-Code beim Erstellen des Produktions-Builds vollständig zu entfernen:
import.meta.env.DEVwird in einem Produktions-Build zufalseaufgelöst, sodass das gesamte Interceptor-Modul während des Tree-Shaking verschwindet.- Die Variable
MODEwird auf etwas anderes alstestgesetzt, wenn Unit-Tests ausgeführt werden, wodurch testspezifischer Code getrennt bleibt. - Ein benutzerdefiniertes Flag,
VITE_ENABLE_MSW, ist standardmäßig auffalsegesetzt und muss zur Aktivierung der Mocks explizit eingeschaltet werden.
Wenn alle drei Bedingungen false sind, gelangt das Mock-Registry niemals in das finale Bundle.
Organisation der Mock-Dateien
Das Repository folgt einem feature-zentrierten Layout:
interfaces/– Enthält die TypeScript-Definitionen, die aus dem Contract Meeting generiert wurden.scenarios.ts– Enthält konkrete Beispiele für erfolgreiche Antworten und Fehlerfälle für jeden Endpunkt.devHandlers.ts– Fungiert als zentrale Registry, die URLs auf die Szenario-Daten abbildet und den Interceptor in Axios einbindet.
Ein kleines Scaffolding-Skript kann diese Dateien automatisch generieren: Man gibt ihm eine URL und das passende Interface, und es erstellt die Stub-Dateien und registriert den Mock. Das Skript liegt außerhalb des Produktions-Code-Pfads, sodass es die Bundle-Größe nicht beeinflusst.
Was das Team gewonnen hat
- Keine Mocks innerhalb von Komponenten – Alle Fake-Daten leben in einer dedizierten Schicht, wodurch der UI-Code sauber bleibt.
- End-to-End-Typsicherheit – Mock-Daten entsprechen denselben TypeScript-Interfaces, die auch für echte Antworten verwendet werden, sodass Unstimmigkeiten zur Kompilierzeit erkannt werden.
- Kein zusätzliches Gewicht in der Produktion – Tree-Shaking entfernt den Interceptor und die Mock-Daten vollständig, sodass die Bundle-Größe unverändert bleibt.
- Gemeinsame Szenarien für Entwicklung und Tests – Dieselben Mock-Definitionen steuern sowohl die lokale Entwicklung als auch automatisierte Tests, was Duplikate reduziert.
Kompromisse und Grenzen
Der Ansatz ersetzt kein echtes Backend. Wenn der Mock-Vertrag von der Live-API abweicht, bemerken Entwickler die Unstimmigkeit erst, nachdem sie das Environment-Flag umgeschaltet haben.
Was als Nächstes zu beachten ist
- Tooling-Integration –
- Breitere Akzeptanz –
- Performance-Monitoring –
Das Fazit ist klar: Durch das Auslagern der Mock-Logik in eine typisierte, umgebungskontrollierte Schicht können Frontend-Teams ihre Komponenten sauber halten, typsicher bleiben und Produktions-Builds ohne versteckte Mock-Payloads ausliefern. Die Aufrechterhaltung eines gemeinsamen Vertrags ist der Preis für einen reibungsloseren Entwicklungsablauf und eine sauberere Codebasis.
