Kapitel 8

Oberflächeninteraktion

Beherrschen Sie das Design von UI-Komponenten, Interaktionsmustern, responsives Design und Prinzipien der Benutzererfahrung, um hervorragende Benutzeroberflächen zu erstellen.

Sequential Thinking verwenden, um KI-gesteuerte Benutzeroberflächeninteraktionen zu lernen

Der Einsatz von KI in der Benutzeroberflächen-Interaktion umfasst mehrere Ebenen und verwendetMethoden des strukturierten DenkensKann Ihnen helfen, systematisch Folgendes zu beherrschen:

1
Grundlegender Überblick über das Interface-Design
Design Tokens, Themesystem und Komponentenarchitektur schnell verstehen
2
KI-gestützte Komponentenentwicklung
Generierung von Komponenten-Code, Stiloptimierung, Auswahl der Komponentenbibliothek
3
KI-gestützte Interaktionsimplementierung
Codegenerierung für Zustandsverwaltung, Formularvalidierung, Animationseffekte
4
KI-gestütztes responsives Design und Barrierefreiheit
Generierung responsiver Layouts, Barrierefreiheitsprüfungen, WCAG-Konformitätsprüfung
5
KI-gesteuerte Leistungsoptimierung
Analyse von Leistungsengpässen, Generierung von Optimierungsplänen, Leistungsüberwachung

Design System

Ein Designsystem ist ein Satz wiederverwendbarer Designstandards und Komponentenbibliotheken, der die Konsistenz und Wartbarkeit des Produkts sicherstellt.

Design Tokens Design Tokens

Design Tokens sind die kleinste Einheit von Designentscheidungen, und CSS-Variablen verwalten Designelemente wie Farben, Abstände und Schriftarten zentral.

Farbsystem (OKLCH-Farbraum)

Die Verwendung des OKLCH-Farbraums erleichtert den Umgang mit Farbkontrast und Theme-Wechseln. Farbdefinitionen im Projekt:

:root {
  --primary: oklch(0.7 0.15 200);
  --background: oklch(0.09 0 0);
  --foreground: oklch(0.98 0 0);
  --border: oklch(0.25 0 0);
  /* ... weitere Farbvariablen */
}

Abstandssystem

Standard-Abstufung für Abstände in Tailwind (4px-Basis): 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64

0
0px
1
4px
2
8px
4
16px
8
32px
12
48px
16
64px
24
96px

Schriftsystem

Schriftfamilie
--font-sans: 'Geist'
--font-mono: 'Geist Mono'
Schriftgrößenverhältnis
xs: 0.75rem, sm: 0.875rem, base: 1rem, lg: 1.125rem, xl: 1.25rem, 2xl: 1.5rem

System für abgerundete Ecken

--radius-sm: calc(var(--radius) - 4px)
--radius-md: calc(var(--radius) - 2px)
--radius-lg: var(--radius)
--radius-xl: calc(var(--radius) + 4px)

Themensystem

Implementierung des Dark Mode

Verwenden next-themes Theme-Umschaltung implementieren:

// app/layout.tsx
import { ThemeProvider } from '@/components/theme-provider'

export default function RootLayout({ children }) {
  return (
    <ThemeProvider
      attribute="class"
      defaultTheme="system"
      enableSystem
      disableTransitionOnChange
    >
      {children}
    </ThemeProvider>
  )
}

Theme-Umschaltung mit CSS-Variablen

Bestanden .dark Klassen-Umschalt-Theme-Variable:

.dark {
  --background: oklch(0.09 0 0);
  --foreground: oklch(0.98 0 0);
  /* Alle Farbvariablen im Dunkelmodus */
}

Komponentenarchitektur

Atomare Design-Methodik

Atom
Schaltflächen, Eingabefelder, Beschriftungen
Button, Input
Molekül
Suchfelder, Formularfelder
SearchBox, FormField
Organisation
Navigationsleiste, Formulare, Kartenlisten
Header, Form, CardList
Vorlage
Seitenlayout-Struktur
DashboardLayout
Seite
Endgültige Benutzeroberfläche
DashboardPage

Komponenten-Variantensystem (CVA)

Verwenden class-variance-authority Komponentenvarianten verwalten:

import { cva, type VariantProps } from 'class-variance-authority'

const buttonVariants = cva(
  'inline-flex items-center justify-center rounded-md',
  {
    variants: {
      variant: {
        default: 'bg-primary text-primary-foreground',
        destructive: 'bg-destructive text-destructive-foreground',
        outline: 'border border-input',
      },
      size: {
        default: 'h-10 px-4 py-2',
        sm: 'h-9 rounded-md px-3',
        lg: 'h-11 rounded-md px-8',
      },
    },
    defaultVariants: {
      variant: 'default',
      size: 'default',
    },
  }
)

Best Practices für KI in der Interaktion mit Benutzeroberflächen

KI nutzen, um die Effizienz der Frontend-UI-Entwicklung zu steigern, mit KI-gestützten Praktiken entlang des gesamten Prozesses – vom Komponentendesign bis zur Leistungsoptimierung.

KI-gestützte Komponentenentwicklung

KI verwenden, um Komponentencode zu generieren

Beschreiben Sie der KI die Anforderungen an die Komponente, und sie generiert eine vollständige React/Next.js-Komponente:

Prompt-Vorlage:

Ich muss eine Benutzerkarten-Komponente mit den folgenden Funktionen erstellen:
1. Das Avatar, den Namen und die E-Mail des Benutzers anzeigen
2. Klicken zum Anzeigen von Details unterstützen
3. Tailwind-CSS-Styles verwenden
4. Dark Mode unterstützen
5. Responsives Design (Mobilgeräte und Desktop)
6. TypeScript verwenden
7. Den Designrichtlinien von shadcn/ui folgen

Bitte generieren Sie den vollständigen Komponenten-Code, einschließlich:
- Typdefinitionen
- Props-Interface
- Stilklassennamen
- Responsive Breakpoints
- Barrierefreiheitsattribute

Von KI generiertes Komponentenbeispiel

// components/user-card.tsx
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import { Card, CardContent } from '@/components/ui/card'

interface UserCardProps {
  name: string
  email: string
  avatar?: string
  onClick?: () => void
}

export function UserCard({ name, email, avatar, onClick }: UserCardProps) {
  const initials = name
    .split(' ')
    .map(n => n[0])
    .join('')
    .toUpperCase()
    .slice(0, 2)

  return (
    <Card 
      className="cursor-pointer transition-shadow hover:shadow-md"
      onClick={onClick}
      role="button"
      tabIndex={0}
      onKeyDown={(e) => {
        if (e.key === 'Enter' || e.key === ' ') {
          onClick?.()
        }
      }}
    >
      <CardContent className="p-4 flex items-center gap-4">
        <Avatar className="h-12 w-12">
          <AvatarImage src={avatar} alt={name} />
          <AvatarFallback>{initials}</AvatarFallback>
        </Avatar>
        <div className="flex-1 min-w-0">
          <h3 className="font-semibold text-foreground truncate">{name}</h3>
          <p className="text-sm text-muted-foreground truncate">{email}</p>
        </div>
      </CardContent>
    </Card>
  )
}

KI-gestützte Stiloptimierung

Verwenden Sie KI, um Tailwind-CSS-Klassennamen zu optimieren und prägnantere, effizientere Styles zu erzeugen:

Prompt:

Optimieren Sie die folgenden Tailwind-CSS-Klassennamen, um sie kürzer und effizienter zu machen:

Aktueller Code:
<div className="flex flex-row items-center justify-between p-4 m-2 bg-white dark:bg-gray-800 rounded-lg shadow-sm hover:shadow-md transition-shadow duration-200">

Bitte:
1. Doppelte Klassennamen zusammenführen
2. Eine knappere Schreibweise verwenden
3. Responsives Design und Dark-Mode-Unterstützung sicherstellen
4. Den gleichen visuellen Effekt beibehalten

Auswahl einer KI-gestützten Komponentenbibliothek

Prompt:

Ich muss für ein Next.js 16 + TypeScript-Projekt eine Komponentenbibliothek auswählen. Die Anforderungen sind:
1. Unterstützung für den Dunkelmodus
2. Hohe Anpassbarkeit
3. Typsicherheit
4. Hervorragende Leistung
5. Eine aktive Community

Bitte vergleichen Sie die folgenden Komponentenbibliotheken:
- shadcn/ui
- Material-UI (MUI)
- Ant Design
- Chakra UI

Geben Sie eine Empfehlung mit Begründung und erklären Sie, wie sie in ein Next.js-Projekt integriert wird.

UI-Komponenten-Design

Die Komponentenisierung ist ein Kernkonzept der modernen Frontend-Entwicklung und baut komplexe Benutzeroberflächen durch die Kombination wiederverwendbarer Komponenten auf.

Detaillierte Tailwind-CSS-Konfiguration

Struktur der Konfigurationsdatei

// tailwind.config.ts
import type { Config } from 'tailwindcss'

const config: Config = {
  content: [
    './app/**/*.{js,ts,jsx,tsx,mdx}',
    './components/**/*.{js,ts,jsx,tsx}',
  ],
  theme: {
    extend: {
      colors: {
        background: 'var(--background)',
        foreground: 'var(--foreground)',
        // CSS-Variablen verwenden
      },
      borderRadius: {
        lg: 'var(--radius)',
        md: 'calc(var(--radius) - 2px)',
        sm: 'calc(var(--radius) - 4px)',
      },
    },
  },
  plugins: [],
}

export default config

Benutzerdefinierte Tool-Klasse

// Benutzerdefinierte Utility-Klassen in globals.css hinzufügen
@layer utilities {
  .text-balance {
    text-wrap: balance;
  }
  
  .scrollbar-hide {
    -ms-overflow-style: none;
    scrollbar-width: none;
  }
  
  .scrollbar-hide::-webkit-scrollbar {
    display: none;
  }
}

Benutzerdefinierte responsive Breakpoints

// tailwind.config.ts
theme: {
  screens: {
    'xs': '475px',
    'sm': '640px',
    'md': '768px',
    'lg': '1024px',
    'xl': '1280px',
    '2xl': '1536px',
  },
}

Dunkelmodus-Einstellungen

Verwenden dark: Präfix:

<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
  {/* Inhalt */}
</div>

Vergleich und Auswahl von Komponentenbibliotheken

KomponentenbibliothekEigenschaftenAnwendungsszenarien
shadcn/uiKopier- und einfügbar, vollständig kontrollierbar, basierend auf Radix UIStark angepasste Projekte, Next.js-Projekte
Material-UIUmfangreiche Komponenten, vollständige Dokumentation, Material DesignUnternehmensanwendungen, schnelles Prototyping
Ant DesignUnternehmensfähige Komponenten, Backoffice-Anwendungen, chinesische DokumentationMiddle-Tier-Systeme, Verwaltungsplattformen
Chakra UIEinfach, modular, TypeScript-UnterstützungModerne Webanwendungen, Projekte, die Flexibilität benötigen

Interaktiver Modus

Gutes Interaktionsdesign macht die Bedienung für Nutzer reibungsloser und intuitiver. Beherrschen Sie Zustandsverwaltung, Formularverarbeitung und Animationstechniken.

Detaillierter Leitfaden zum State-Management

useState-Best Practices

// Verwende funktionale Updates, um Closure-Probleme zu vermeiden
const [count, setCount] = useState(0)

// Korrekt: funktionale Updates verwenden
setCount(prev => prev + 1)

// Vermeiden: direkt von state abhängig sein
setCount(count + 1) // möglicherweise ungenau

// Für komplexen Zustand useReducer verwenden
const [state, dispatch] = useReducer(reducer, initialState)

Best Practices für die Formularverarbeitung

Beispiel für Formularvalidierung

// Vollständiges Beispiel einer Formular-Komponente
'use client'

import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { z } from 'zod'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'

const formSchema = z.object({
  username: z.string().min(2, 'Der Benutzername muss mindestens 2 Zeichen lang sein'),
  email: z.string().email('Ungültige E-Mail-Adresse'),
})

export function UserForm() {
  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      username: '',
      email: '',
    },
  })

  function onSubmit(values: z.infer<typeof formSchema>) {
    console.log(values)
  }

  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
        <FormField
          control={form.control}
          name="username"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Benutzername</FormLabel>
              <FormControl>
                <Input {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit">Senden</Button>
      </form>
    </Form>
  )
}

Optimierung der Formularleistung

  • Verwenden mode: 'onBlur' Die Anzahl der Überprüfungen reduzieren
  • Verwendung komplexer Formulare useFieldArray Dynamische Felder verwalten
  • Verwendung großer Formulare shouldUnregister Speicher optimieren

Benutzer-Feedback-System

Toast-Benachrichtigungen

import { toast } from 'sonner'

toast.success('Vorgang erfolgreich')
toast.error('Vorgang fehlgeschlagen')
toast.info('Hinweis')

Ladezustand

// Skeleton-Laden
<Skeleton className="h-4 w-[250px]" />

// Spinner
<Loader2 className="h-4 w-4 animate-spin" />

Animationen und Übergänge

Tailwind-Animationen

// tailwindcss-animate verwenden
<div className="animate-in fade-in slide-in-from-top-4">
  {/* Inhalt */}
</div>

// Häufig verwendete Animationsklassen
animate-in          // Eingangsanimation
animate-out         // Ausgangsanimation
fade-in             // Einblenden
slide-in-from-top  // Von oben hereinrutschen
duration-300        // Dauer

Leistungsaspekte

  • Verwenden transform und opacity GPU-Beschleunigung auslösen
  • Animationen vermeiden widthheight Eigenschaften wie
  • Verwenden will-change Tipps zur Browser-Optimierung

Responsives Design

Stellen Sie sicher, dass die Benutzeroberfläche auf verschiedenen Geräten eine gute Benutzererfahrung bietet. Verfolgen Sie eine Mobile-First-Strategie und verwenden Sie flexible Layout-Techniken.

Mobile-First-Strategie

Prinzipien des mobilen Designs

  • Zuerst für Mobilgeräte entwerfen, dann das Desktop-Erlebnis schrittweise verbessern
  • Die Interaktionen auf Mobilgeräten vereinfachen und die Anzahl der Schritte reduzieren
  • Touch-Zielgröße optimieren (mindestens 44x44px)
  • Mobile Inhalte reduzieren und Kernfunktionen hervorheben

Mobile Navigationsmuster

Untere Navigation
Geeignet für den Haupteinstiegspunkt der Funktion
Hamburger-Menü
Geeignet für sekundäre Funktionen
Registerkarte
Geeignet für die Inhaltsklassifizierung

Layout-Techniken

Fortgeschrittene Flexbox-Anwendungen

// Responsives Flexbox
<div className="flex flex-col md:flex-row gap-4">
  <div className="flex-1">Inhalt 1</div>
  <div className="flex-1">Inhalt 2</div>
</div>

// Ausrichtung
<div className="flex items-center justify-between">
  {/* Vertikal zentriert, horizontal mit Abstand zwischen den Elementen */}
</div>

Breakpoint-Strategie

sm
≥640px
Kleingeräte mit Bildschirm
md
≥768px
Tablet
lg
≥1024px
Laptop
xl
≥1280px
Desktop
2xl
≥1536px
Großbildschirm
// Best Practices für Breakpoints
// Mobile-First: Standardstile gelten für Mobilgeräte
<div className="text-sm md:text-base lg:text-lg">
  {/* Von kleinen zu großen Bildschirmen schrittweise verbessern */}
</div>

// Vermeiden: Desktop-First (nicht empfohlen)
<div className="text-lg md:text-base sm:text-sm">
  {/* Dies erhöht die Belastung für Mobilgeräte */}
</div>

Mobile Optimierung

Viewport-Konfiguration

// app/layout.tsx
export const metadata = {
  viewport: {
    width: 'device-width',
    initialScale: 1,
    maximumScale: 5,
  },
}

Verarbeitung von Touch-Ereignissen

  • Verwenden touch-action Touch-Reaktionszeit optimieren
  • Vermeiden hover Zustand durch unbeabsichtigte Berührungen auf dem Mobilgerät
  • Verwenden @media (hover: hover) Erkennen, ob das Gerät Hover unterstützt

Barrierefreiheit

Barrierefreiheit stellt sicher, dass alle Nutzer deine App verwenden können, einschließlich Nutzer von Assistenztechnologien. Befolge die WCAG-Standards, um dein Produkt inklusiver zu machen.

WCAG-Standard

WCAG-2.1-Stufe

Stufe A
Mindestanforderungen, grundlegende Barrierefreiheit
Stufe AA (empfohlen)
Der Standard, den die meisten Websites erfüllen sollten
AAA-Niveau
Höchste Standards, besondere Anforderungen

Zentrale Prinzipien (POUR)

Wahrnehmbar
Informationen können auf verschiedene Weise wahrgenommen werden
Umsetzbar
UI-Komponenten und Navigation sind bedienbar
Verständlich
Informationen und Vorgänge sind verständlich
Kann robust sein
Inhalte können von verschiedenen assistiven Technologien interpretiert werden

Tastaturnavigation

Verwaltung der Tab-Reihenfolge

// Verwenden Sie tabIndex, um die Tab-Reihenfolge zu steuern
<button tabIndex={1}>Erster</button>
<button tabIndex={2}>Zweiter</button>

// Nicht interaktive Elemente überspringen
<div tabIndex={-1}>Dieses Element überspringen</div>

// Aus der Tab-Reihenfolge entfernen (nicht empfohlen, außer wenn nötig)
<button tabIndex={-1}>Über Tab nicht erreichbar</button>

Fokusverwaltung

// Fokusfalle (Focus Trap) - in Modals verwendet
import { FocusTrap } from '@radix-ui/react-focus-trap'

<FocusTrap>
  <Dialog>
    {/* Der Fokus ist auf den Dialog beschränkt */}
  </Dialog>
</FocusTrap>

// Fokus-sichtbare Stile
<button className="focus-visible:ring-2 focus-visible:ring-primary">
  {/* Fokus-Ring bei Tastaturnavigation anzeigen */}
</button>

Unterstützung für Tastenkürzel

  • Enter/Leertaste: eine Schaltfläche oder einen Link aktivieren
  • Esc: Modalfenster oder Menü schließen
  • Arrow Keys: Liste oder Menüpunkte navigieren
  • Tab: Zwischen fokussierbaren Elementen wechseln

Unterstützung für Bildschirmleseprogramme

Verwendung von ARIA-Labels

// aria-label: gibt einem Element eine Beschriftung
<button aria-label="Dialog schließen">
  <X />
</button>

// aria-labelledby: verweist auf die ID eines anderen Elements
<div aria-labelledby="dialog-title">
  <h2 id="dialog-title">Dialogtitel</h2>
</div>

// aria-describedby: bietet eine zusätzliche Beschreibung
<input 
  aria-describedby="email-help"
  aria-invalid={hasError}
/>
<span id="email-help">Bitte geben Sie eine gültige E-Mail-Adresse ein</span>

Semantisches HTML

// Semantische Tags verwenden
<nav>Navigation</nav>
<main>Hauptinhalt</main>
<article>Artikel</article>
<section>Abschnitt</section>
<aside>Seitenleiste</aside>
<header>Kopfbereich</header>
<footer>Fußzeile</footer>

// Vermeiden: div anstelle semantischer Tags verwenden
<div className="nav"> {/* Nicht empfohlen */}
<nav> {/* Empfohlen */}

Rollenbeschreibung

// Verwenden Sie das role-Attribut (wenn semantische Tags nicht verfügbar sind)
<div role="button" tabIndex={0} onClick={handleClick}>
  Benutzerdefinierte Schaltfläche
</div>

<div role="alert" aria-live="polite">
  Wichtiger Hinweis
</div>

<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
  {/* Modaler Dialog */}
</div>

Farbkontrast

WCAG-AA-Standard

Normaler Text
Kontrast ≥ 4,5:1
Großer Text (18px+ oder 14px+ fett)
Kontrastverhältnis ≥ 3:1

Werkzeugprüfung

  • WebAIM Contrast Checker: Online-Tool zur Kontrastprüfung
  • Lighthouse: In Chrome DevTools integriert
  • axe DevTools: Browser-Erweiterung

Verlassen Sie sich nicht auf Farbe, um Informationen zu vermitteln

// Fehler: Status nur mit Farbe anzeigen
<span className="text-red-500">Fehler</span>

// Korrekt: Farbe + Symbol/Text
<span className="text-red-500 flex items-center gap-1">
  <AlertCircle />
  Fehler: Bitte geben Sie einen gültigen Wert ein
</span>

Barrierefreiheitstests

Automatisierte Testtools

axe
npm install @axe-core/react
Lighthouse
Chrome DevTools
WAVE
Browser-Erweiterung

Manueller Testablauf

  1. Die gesamte Anwendung nur mit der Tastatur steuern
  2. Mit Screenreadern testen (NVDA, JAWS, VoiceOver)
  3. Den Farbkontrast überprüfen
  4. Sicherstellen, dass alle Bilder einen Alt-Text haben
  5. Fehlermeldung des Testformulars

Tastatur-Test-Checkliste

  • Alle interaktiven Elemente sind per Tab erreichbar
  • Die Logik der Fokusreihenfolge ist plausibel
  • Fokus sichtbar (mit Fokusring)
  • Das Dialogfenster kann mit Esc geschlossen werden
  • Das Menü kann mit den Pfeiltasten navigiert werden

Leistungsoptimierung

Die Leistung wirkt sich direkt auf die Benutzererfahrung aus. Optimieren Sie die Rendering-Leistung, das Laden von Ressourcen und die Laufzeitleistung, um sicherzustellen, dass die Anwendung schnell reagiert.

Render-Leistung

React-Rendering-Optimierung

// memo verwenden, um unnötige Re-Renders zu vermeiden
const ExpensiveComponent = React.memo(({ data }) => {
  return <div>{/* komplexes Rendering */}</div>
})

// useMemo verwenden, um berechnete Ergebnisse zu cachen
const expensiveValue = useMemo(() => {
  return computeExpensiveValue(a, b)
}, [a, b])

// useCallback verwenden, um Funktionen zu cachen
const handleClick = useCallback(() => {
  doSomething(id)
}, [id])

Virtuelles Scrollen

Bei großen Listen verwenden Sie virtuelles Scrollen, um nur sichtbare Elemente zu rendern:

// Verwenden Sie react-window oder react-virtualized
import { FixedSizeList } from 'react-window'

<FixedSizeList
  height={600}
  itemCount={10000}
  itemSize={50}
  width="100%"
>
  {Row}
</FixedSizeList>

Code-Splitting

// Komponente dynamisch importieren
import dynamic from 'next/dynamic'

const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
  loading: () => <Skeleton />,
  ssr: false, // falls Sie SSR deaktivieren müssen
})

// Code-Splitting auf Routenebene (von Next.js automatisch gehandhabt)
// app/dashboard/page.tsx wird automatisch aufgeteilt

Ressourcenoptimierung

Bildoptimierung

// Automatische Optimierung durch die Next.js Image-Komponente
import Image from 'next/image'

<Image
  src="/hero.jpg"
  alt="Hero"
  width={1200}
  height={600}
  priority // Bild above the fold
  loading="lazy" // Bild below the fold
  placeholder="blur" // unscharfer Platzhalter
/>

// Unterstützt moderne Formate wie WebP und AVIF
// Generiert automatisch responsive Bilder

Schriftoptimierung

// Use next/font to optimize fonts
import { GeistSans } from 'next/font/google'

const geistSans = GeistSans({
  subsets: ['latin'],
  display: 'swap', // Font loading strategy
  preload: true,
})

// Font subsetting, load only the required characters

Ressourcen-Vorabladen

// Drittanbieter-Domains vorverbinden
<link rel="preconnect" href="https://fonts.googleapis.com" />

// Kritische Ressourcen vorladen
<link rel="preload" href="/fonts/geist.woff2" as="font" />

// Ressourcen der nächsten Seite vorab abrufen
<link rel="prefetch" href="/dashboard" />

Laufzeitleistung

Optimierung der Bundle-Größe

  • Verwenden bundle analyzer Bundle-Größe analysieren
  • Bibliotheken nach Bedarf importieren (import { debounce } from 'lodash-es'
  • Nicht verwendete Abhängigkeiten entfernen

Tree Shaking

Next.js und moderne Build-Tools führen automatisch Tree Shaking durch, um ungenutzten Code zu entfernen.

Leistungsüberwachung

Core Web Vitals

LCP
Largest Contentful Paint < 2,5 s
FID
Erste Eingabeverzögerung < 100 ms
CLS
Kumulative Layout-Verschiebung < 0.1

Leistungsanalyse-Tools

  • React DevTools Profiler: die Rendering-Performance von Komponenten analysieren
  • Lighthouse: Leistungsprüfung in Chrome DevTools
  • Web Vitals Extension: Echtzeitüberwachung der Core Web Vitals

Praxisbeispiele

Lernen Sie anhand praktischer Codebeispiele, wie hochwertige UI-Komponenten und Interaktionen erstellt werden.

Vollständiges Beispiel einer Formular-Komponente

'use client'

import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { z } from 'zod'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'
import { toast } from 'sonner'

const formSchema = z.object({
  name: z.string().min(2, 'Der Name muss mindestens 2 Zeichen haben'),
  email: z.string().email('Ungültige E-Mail-Adresse'),
  age: z.number().min(18, 'Das Alter muss größer als 18 sein').max(100),
})

export function UserForm() {
  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      name: '',
      email: '',
      age: 18,
    },
  })

  async function onSubmit(values: z.infer<typeof formSchema>) {
    try {
      await saveUser(values)
      toast.success('Benutzer erfolgreich erstellt')
      form.reset()
    } catch (error) {
      toast.error('Erstellung fehlgeschlagen, bitte erneut versuchen')
    }
  }

  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
        <FormField
          control={form.control}
          name="name"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Name</FormLabel>
              <FormControl>
                <Input placeholder="Bitte geben Sie Ihren Namen ein" {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit" disabled={form.formState.isSubmitting}>
          {form.formState.isSubmitting ? 'Wird gesendet...' : 'Senden'}
        </Button>
      </form>
    </Form>
  )
}

Lernergebnisse

Nach Abschluss dieses Kapitels werden Sie:

  • 1Die Grundlagen von Designsystemen verstehen und Design Tokens, Themesysteme sowie die Komponentenarchitektur beherrschen
  • 2Sicher im Umgang mit Tailwind CSS und shadcn/ui, in der Lage, Komponentenbibliotheken zu konfigurieren und anzupassen
  • 3Beherrschen Sie State Management, Formularverarbeitung und Animationstechniken, um ein reibungsloses interaktives Erlebnis zu schaffen
  • 4Beherrschen Sie Methoden des responsiven Designs und verwenden Sie eine Mobile-First-Strategie sowie moderne Layout-Techniken
  • 5Die Barrierefreiheitsstandards (WCAG) verstehen und Tastaturnavigation sowie Unterstützung für Bildschirmleser umsetzen können
  • 6Beherrschen Sie Techniken zur Leistungsoptimierung, einschließlich Rendering-Optimierung, Ressourcenladen und Leistungsüberwachung
  • 7In der Lage, vollständige Formularkomponenten, responsive Layouts und interaktive Funktionen zu erstellen