Aeromir
Unternehmenswebsite eines Unternehmens für Klimatechnik
Rolle
Fullstack-Entwickler (Frontend + Server-BFF-Schicht)
Jahr
2026
Stack
Nuxt 4 / Vue 3 / TypeScriptNuxt UI v4GSAP 3 (MotionPathPlugin)vee-validate + ZodWordPress REST API (headless CMS, ACF, Yoast SEO)Nitro (BFF)

Die Aufgabe
Das Unternehmen benötigte eine Website, die zwei gegensätzliche Anforderungen gleichzeitig erfüllt:
- Bereitstellung eines performanten, modernen und SEO-optimierten Frontends zur optimalen Präsentation realisierter Projekte und Dienstleistungen.
- Ermöglichung einer eigenständigen Verwaltung und Bearbeitung von Inhalten (Artikel, Preise, Projektdetails) durch das Marketing-Team, ohne für jede Änderung einen Entwickler einbeziehen zu müssen.
Dies führte zur Architekturentscheidung, das Projekt in Headless WordPress (für komfortables Content- und Medienmanagement) und Nuxt 4 (für schnelles Rendering und maximale Interaktivität) aufzuteilen. Dabei wird strikt sichergestellt, dass weder WP-Zugangsdaten noch rohe, überdimensionierte REST-Antworten jemals den Browser erreichen.
Die Phasen
Architektur und Sitemap
- Konzeption der Seitenstruktur: Dienstleistungen, Portfolio mit Typenfilterung, SEO-Preis-Landingpages und Artikel.
- Von Beginn an wurde eine strikte Trennung zwischen der Nuxt-App (
app/) und dem Nitro-Server (server/) etabliert, um sicherzustellen, dass WordPress ausschließlich als isolierte Datenquelle und nicht als direkter Zugriffspunkt für den Browser dient.
Entwicklung der BFF-Schicht über WordPress REST
- Einrichtung von Server-Routen, die die WP REST API via Basic Auth (Application Passwords) proxien.
- Entwicklung typisierter Transformer, die rohe WordPress-Antworten (einschließlich verschachtelter
_embedded-Medien und ACF-Felder) in flache, saubere TypeScript-Modelle (Project,Article) umwandeln.
Komponenten-System und Barrierefreiheit
- Umsetzung des Figma-Designs in wiederverwendbare Vue-Komponenten. Konfiguration von Tailwind v4 im CSS-First-Modus (
@themeinmain.css). -Aufbau des Kontaktformulars mitvee-validate+ Zod sowie Integration von Barrierefreiheitsstandards direkt in die Basis-UiFormField-Komponente (automatische Generierung vonaria-invalidundaria-describedbyfür Fehler).
GSAP-Animations-Engineering
- Entwicklung der komplexen Sektion „Arbeitsprozess“ unter Verwendung des GSAP MotionPathPlugins.
- Erstellung von drei unabhängigen Pfaden, die auf verschiedene Breakpoints (Mobile/Tablet/Desktop) zugeschnitten sind. Implementierung von Lazy Loading für Animationen via IntersectionObserver und eines robusten Resize-Handlers, um eine reibungslose Performance auf mobilen Browsern sicherzustellen.
Formulare und Verfügbarkeit
- Ein Antragsformular wurde mit vee-validate und Zod sowie einem typisierten Validierungsschema (Name, Telefonnummer (Anzahl der Ziffern), optionale E-Mail-Adresse (regulärer Ausdruck)) erstellt.
- Das Modal wird programmatisch über
useOverlay()von Nuxt UI aufgerufen, wodurch eine einzelne Formularkomponente mit unterschiedlichem Kontexttext wiederverwendet werden kann (CTA in „Arbeitsphasen“ und personalisierte CTAs für Teamkarten).
Das gemeinsam genutzte UiFormField stellt automatisch aria-invalid, aria-describedby und role="alert" für Fehler bereit – Barrierefreiheit ist kein separates Thema, sondern ein Nebeneffekt der wiederverwendbaren Komponente.
Der Prozess
Technologie-Stack
| Schicht | Technologien |
|---|---|
| Frontend | Nuxt 4, Vue 3, TypeScript, Tailwind CSS v4, Nuxt UI v4 |
| Animationen | GSAP 3 (inklusive MotionPathPlugin) |
| Formulare & Validierung | vee-validate + Zod |
| CMS (Backend) | WordPress REST API (headless, ACF, Yoast SEO) |
| BFF-Schicht | Nitro (Server Routes, cachedEventHandler) |
Über das Projekt & die Aufgabe
„Aero-mir“ ist ein Full-Service-Unternehmen für Klimasystemtechnik mit Sitz in Nowosibirsk (seit 2011 auf dem Markt).
Das Unternehmen musste zwei widersprüchliche Anforderungen erfüllen: Eine moderne, schnelle und verkaufsfördernde Website mit exzellentem SEO sollte entstehen, während das Marketing-Team sein gewohntes Admin-Panel behalten wollte, um Artikel, Preise und das Portfolio selbstständig bearbeiten zu können. Daraus resultierte die Architektur-Entscheidung: Aufteilung des Projekts in Headless WordPress (Datenbank und Medien) und Nuxt 4 (Rendering, Interaktivität, SEO). Ich entwickle die Seite von Grund auf neu – vom Design der BFF-Schicht bis hin zur UI-Entwicklung und komplexen Animationen.
Unter der Haube
BFF-Schicht über die WordPress REST API
Die wichtigste Regel dieses Projekts: Der Browser kommuniziert niemals direkt mit WordPress. Ich habe die Logik in die Nuxt-Anwendung (app/) und den Nitro-Server (server/) getrennt.
Die Nitro-Server-Routen fungieren als BFF (Backend-for-Frontend): Sie leiten Anfragen über Basic Auth weiter, rufen nur die zwingend benötigten Felder aus dem CMS ab (über _fields und _embed), um keine unnötigen JSON-Daten an den Client zu senden, und liefern dem Frontend saubere Daten.
Ich habe eine Schicht aus typisierten Transformern geschrieben: Rohe WP-Daten (ACF-Felder, verschachtelte Medien, Yoast SEO) werden on the fly in strikte TypeScript-Modelle (Project, Article) umgewandelt. Das Frontend muss nicht raten, ob ein Objekt das benötigte Feld enthält – es arbeitet einfach mit fertigen Interfaces.
Zur Optimierung habe ich den Abruf von Listen in einen cachedEventHandler verpackt und die Auflösung des Kategorie-slugs zur ID im Arbeitsspeicher des Prozesses gecacht. Nun wird WordPress nicht bei jedem Seitenaufruf belastet:
const categoryCache = new Map<string, number>();
export async function getCategoryId(slug: string): Promise<number> {
if (categoryCache.has(slug)) return categoryCache.get(slug)!;
const categories = await wpFetch<WPTerm[]>('/categories', { query: { slug } });
if (!categories[0]) throw createError({ statusCode: 500, message: `Category not found` });
categoryCache.set(slug, categories[0].id);
return categories[0].id;
}
Animation als Engineering-Aufgabe
Die Sektion „Arbeitsprozess“ ist eine komplexe Szene, die vom GSAP MotionPathPlugin angetrieben wird, bei der sich ein Maskottchen entlang einer gekrümmten Bahn bewegt. Damit dies auf allen Geräten einwandfrei funktioniert:
- Es wurden drei separate SVG-Pfade (für Mobile, Tablet und Desktop) gezeichnet, anstatt sich auf einen einzigen Pfad mit CSS-Transformationen zu verlassen. Die Fortschrittspunkte werden für jeden Breakpoint individuell synchronisiert.
- Es wurde ein intelligenter Resize-Handler implementiert. Im mobilen Safari wird durch Scrollen die Adressleiste ausgeblendet, was ein
resize-Ereignis auslöst, das normalerweise Animationen zum Ruckeln bringt. Ich habe einen Handler geschrieben, der GSAP nur dann neu startet, wenn sich die Breite des Viewports oder der Layout-Modus tatsächlich ändert – Höhenänderungen werden ignoriert. - GSAP und seine Plugins werden über dynamische
import()-Aufrufe ausschließlich bei IntersectionObserver-Triggern geladen. Auf Seiten ohne Animationen landen diese ~30kb gar nicht erst im Bundle.
let resizeRaf = 0;
const onResize = () => {
if (resizeRaf) cancelAnimationFrame(resizeRaf);
resizeRaf = requestAnimationFrame(() => {
const nextWidth = window.innerWidth;
const nextLayoutMode = getLayoutMode();
// Ignoriere reine Höhenänderungen des Viewports (Hack für iOS Safari)
if (nextWidth === lastViewportWidth && nextLayoutMode === lastLayoutMode) return;
lastViewportWidth = nextWidth;
lastLayoutMode = nextLayoutMode;
initAnimation();
});
};
Maßgeschneiderte UI-Lösungen
Ich habe ein useHeader-Composable geschrieben, das das Scrollen bei geöffnetem mobilem Menü blockiert, ohne dass der Inhalt optisch „springt“ (indem die Breite der verschwindenden Scrollbar durch padding-right kompensiert wird). Endlose Partner-Karussells sind rein mit CSS erstellt, inklusive eines Fallbacks für prefers-reduced-motion. Formulare werden mit vee-validate + Zod gebaut, und Aspekte der Barrierefreiheit (Accessibility wie aria-invalid, role="alert") sind direkt in die Basis-UI-Komponenten integriert.
Aktueller Status & Ergebnisse
Die Website befindet sich in aktiver Entwicklung. Die Logik der BFF-Schicht ist vollständig abgeschlossen, ebenso wie 9 Sektionen der Startseite (vom Hero-Bereich bis zur Portfolio-Übersicht und dem Footer mit Kontaktformular). Die internen Seiten (Portfolio-Katalog mit Filtern, Artikel, Dienstleistungen) werden derzeit finalisiert. Die Fertigstellung wird in den kommenden Wochen erwartet.
Die Ergebnisse
vollständig implementierte und animierte Sektionen auf der Startseite
einzigartige SVG-Pfade für adaptive Animationen des Arbeitsprozesses
WP-Zugangsdaten oder rohe REST-Antworten, die den Browser erreichen (absolute Datenisolation durch das BFF)