Start
Alle Projekte

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)

Aeromir

Die Aufgabe

Das Unternehmen benötigte eine Website, die zwei gegensätzliche Anforderungen gleichzeitig erfüllt:

  1. Bereitstellung eines performanten, modernen und SEO-optimierten Frontends zur optimalen Präsentation realisierter Projekte und Dienstleistungen.
  2. 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

01

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.
02

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.
03

Komponenten-System und Barrierefreiheit

  • Umsetzung des Figma-Designs in wiederverwendbare Vue-Komponenten. Konfiguration von Tailwind v4 im CSS-First-Modus (@theme in main.css). -Aufbau des Kontaktformulars mit vee-validate + Zod sowie Integration von Barrierefreiheitsstandards direkt in die Basis-UiFormField-Komponente (automatische Generierung von aria-invalid und aria-describedby für Fehler).
04

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.
05

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

SchichtTechnologien
FrontendNuxt 4, Vue 3, TypeScript, Tailwind CSS v4, Nuxt UI v4
AnimationenGSAP 3 (inklusive MotionPathPlugin)
Formulare & Validierungvee-validate + Zod
CMS (Backend)WordPress REST API (headless, ACF, Yoast SEO)
BFF-SchichtNitro (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:

typescript
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.
typescript
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

9

vollständig implementierte und animierte Sektionen auf der Startseite

3

einzigartige SVG-Pfade für adaptive Animationen des Arbeitsprozesses

0

WP-Zugangsdaten oder rohe REST-Antworten, die den Browser erreichen (absolute Datenisolation durch das BFF)

Screens