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:
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
Schriftsystem
System für abgerundete Ecken
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
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 configBenutzerdefinierte 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
| Komponentenbibliothek | Eigenschaften | Anwendungsszenarien |
|---|---|---|
| shadcn/ui | Kopier- und einfügbar, vollständig kontrollierbar, basierend auf Radix UI | Stark angepasste Projekte, Next.js-Projekte |
| Material-UI | Umfangreiche Komponenten, vollständige Dokumentation, Material Design | Unternehmensanwendungen, schnelles Prototyping |
| Ant Design | Unternehmensfähige Komponenten, Backoffice-Anwendungen, chinesische Dokumentation | Middle-Tier-Systeme, Verwaltungsplattformen |
| Chakra UI | Einfach, modular, TypeScript-Unterstützung | Moderne 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
useFieldArrayDynamische Felder verwalten - Verwendung großer Formulare
shouldUnregisterSpeicher 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 // DauerLeistungsaspekte
- Verwenden
transformundopacityGPU-Beschleunigung auslösen - Animationen vermeiden
width、heightEigenschaften wie - Verwenden
will-changeTipps 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
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
// 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-actionTouch-Reaktionszeit optimieren - Vermeiden
hoverZustand 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
Zentrale Prinzipien (POUR)
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
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
Manueller Testablauf
- Die gesamte Anwendung nur mit der Tastatur steuern
- Mit Screenreadern testen (NVDA, JAWS, VoiceOver)
- Den Farbkontrast überprüfen
- Sicherstellen, dass alle Bilder einen Alt-Text haben
- 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 aufgeteiltRessourcenoptimierung
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 BilderSchriftoptimierung
// 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 charactersRessourcen-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 analyzerBundle-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
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