Svelte der Compiler-Ansatz für schlanke, schnelle Interfaces
Svelte unterscheidet sich grundlegend von React und Vue. Statt zur Laufzeit ein Virtual DOM zu pflegen, kompiliert Svelte die Komponenten zu hochoptimiertem JavaScript, das das DOM direkt manipuliert. Das hat reale Konsequenzen: kleinere Bundles, schnellerer Start, weniger Boilerplate. Wir setzen Svelte ein, wenn Performance, schlanke Auslieferung oder elegante Reaktivität messbar zählen, und übergeben die fertigen Komponenten dokumentiert zur Nutzung unter Ihrem Namen.
01 / Einsatz
Wofür sich Svelte eignet
- Performance-kritische UI-Komponenten in bestehende Apps integrieren
- Interaktive Tools (Konfiguratoren, Visualisierungen) mit reaktivem State
- Eingebettete Widgets, bei denen Bundle-Size ein Kriterium ist
- Embedded Dashboards in größeren Anwendungen
- Custom-Elements / Web-Components-Builds für Cross-Framework-Nutzung
02 / Einblick
Svelte in der Praxis
Eine Suche. Drei Umsetzungen.
Dieselbe Suche in React, Vue und Svelte. Wechseln Sie zwischen den Codebeispielen und vergleichen Sie Zustände, Eingabebindung und die Ausgabe der Ergebnisse.
useState hält Eingabe und Ergebnis. useEffect startet die Suche; seine Aufräumfunktion beendet Timer und überholte Anfragen.
Passt, wenn bereits React-Komponenten vorhanden sind oder die Agentur ein React-Projekt weiterführen möchte.
Effekt-Abhängigkeiten und asynchrone Zustände brauchen klare Regeln. Für größere Anwendungen legen wir Datenabrufe und Fehlerbehandlung gemeinsam fest.
Code in React
'use client'
import { useEffect, useState } from 'react'
import { searchTopics, type Topic } from './search-source'
export function TopicSearch() {
const [query, setQuery] = useState('')
const [items, setItems] = useState<Topic[]>([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState('')
useEffect(() => {
const controller = new AbortController()
setLoading(true)
setError('')
const timer = setTimeout(async () => {
try {
const results = await searchTopics(query, { signal: controller.signal })
if (!controller.signal.aborted) setItems(results)
} catch {
if (!controller.signal.aborted) setError('Die Suche ist nicht erreichbar.')
} finally {
if (!controller.signal.aborted) setLoading(false)
}
}, 250)
return () => { clearTimeout(timer); controller.abort() }
}, [query])
return <section>
<label>Thema suchen
<input value={query} onChange={event => setQuery(event.target.value)} />
</label>
<div role="status" aria-live="polite" aria-busy={loading}>
{loading ? <p>Suche läuft …</p> : error ? <p>{error}</p> :
items.length === 0 ? <p>Keine passenden Themen.</p> :
<ul>{items.map(item => <li key={item.id}>{item.title}</li>)}</ul>}
</div>
</section>
}ref hält die Werte. watch beobachtet die Eingabe und räumt über onCleanup die vorherige Suche auf. Das Template beschreibt die Zustände.
Passt zu vorhandenen Vue-Oberflächen und Teams, die mit Templates und der Composition API arbeiten.
Reaktivität ersetzt keine Anwendungsarchitektur. Datenfluss, gemeinsame Zustände und zusätzliche Bibliotheken müssen zum Projekt passen.
Code in Vue
<script setup lang="ts">
import { ref, watch } from 'vue'
import { searchTopics, type Topic } from './search-source'
const query = ref('')
const items = ref<Topic[]>([])
const loading = ref(true)
const error = ref('')
watch(query, (value, _, onCleanup) => {
const controller = new AbortController()
loading.value = true
error.value = ''
const timer = setTimeout(async () => {
try {
const results = await searchTopics(value, { signal: controller.signal })
if (!controller.signal.aborted) items.value = results
} catch {
if (!controller.signal.aborted) error.value = 'Die Suche ist nicht erreichbar.'
} finally {
if (!controller.signal.aborted) loading.value = false
}
}, 250)
onCleanup(() => { clearTimeout(timer); controller.abort() })
}, { immediate: true })
</script>
<template>
<section>
<label>Thema suchen <input v-model="query" /></label>
<div role="status" aria-live="polite" :aria-busy="loading">
<p v-if="loading">Suche läuft …</p>
<p v-else-if="error">{{ error }}</p>
<p v-else-if="items.length === 0">Keine passenden Themen.</p>
<ul v-else><li v-for="item in items" :key="item.id">{{ item.title }}</li></ul>
</div>
</section>
</template>$state hält die Werte. $effect erfasst die Eingabe als Abhängigkeit und gibt eine Aufräumfunktion für Timer und Anfrage zurück.
Passt zu eigenständigen Oberflächen und Werkzeugen, wenn die benötigten Integrationen verfügbar sind und das übernehmende Team Svelte kennt.
Benötigte Komponenten und Schnittstellen prüfen wir vor der Festlegung. Ein kurzer Komponentenquelltext belegt noch keine bessere Gesamtanwendung.
Code in Svelte
<script lang="ts">
import { searchTopics, type Topic } from './search-source'
let query = $state('')
let items = $state<Topic[]>([])
let loading = $state(true)
let error = $state('')
$effect(() => {
const value = query // Abhängigkeit vor dem asynchronen Abruf lesen
const controller = new AbortController()
loading = true
error = ''
const timer = setTimeout(async () => {
try {
const results = await searchTopics(value, { signal: controller.signal })
if (!controller.signal.aborted) items = results
} catch {
if (!controller.signal.aborted) error = 'Die Suche ist nicht erreichbar.'
} finally {
if (!controller.signal.aborted) loading = false
}
}, 250)
return () => { clearTimeout(timer); controller.abort() }
})
</script>
<section>
<label>Thema suchen <input bind:value={query} /></label>
<div role="status" aria-live="polite" aria-busy={loading}>
{#if loading}<p>Suche läuft …</p>
{:else if error}<p>{error}</p>
{:else if items.length === 0}<p>Keine passenden Themen.</p>
{:else}<ul>{#each items as item (item.id)}<li>{item.title}</li>{/each}</ul>
{/if}
</div>
</section>Rahmen des Beispiels und gemeinsame Datenquelle
Alle drei Beispiele verwenden dieselbe lokale Datenquelle search-source.ts. Nach einer kurzen Eingabepause startet die Suche. Eine neue Eingabe bricht die vorherige Anfrage ab. Ladezustand, leere Ergebnisse und Fehler gehören zur gleichen Aufgabe. Die gemeinsame Hilfsdatei steht unten; die Codeansicht oben zeigt die jeweilige Komponente.
export interface Topic {
id: string
title: string
category: string
}
const topics: Topic[] = [
{ id: 'design', title: 'Designsystem aufbauen', category: 'Gestaltung' },
{ id: 'cms', title: 'Inhalte mit einem CMS pflegen', category: 'Websites' },
{ id: 'api', title: 'Schnittstellen verbinden', category: 'Entwicklung' },
{
id: 'forms',
title: 'Formulare verständlich gestalten',
category: 'Gestaltung',
},
]
// Lokale Beispieldaten. Die Verzögerung macht Ladezustände sichtbar;
// sie misst nicht die Geschwindigkeit eines Frameworks.
export function searchTopics(
query: string,
{ signal, fail = false }: { signal: AbortSignal; fail?: boolean },
): Promise<Topic[]> {
return new Promise((resolve, reject) => {
if (signal.aborted) {
reject(new DOMException('Suche abgebrochen', 'AbortError'))
return
}
const cancel = () => {
clearTimeout(timer)
reject(new DOMException('Suche abgebrochen', 'AbortError'))
}
const timer = setTimeout(() => {
signal.removeEventListener('abort', cancel)
if (fail) {
reject(new Error('Die Suche ist gerade nicht erreichbar.'))
return
}
const term = query.trim().toLocaleLowerCase('de')
resolve(
topics.filter((topic) =>
`${topic.title} ${topic.category}`
.toLocaleLowerCase('de')
.includes(term),
),
)
}, 400)
signal.addEventListener('abort', cancel, { once: true })
})
}03 / Vorgehen
So arbeiten wir mit Svelte
-
Projekt-Setup (Vite-basiert, TypeScript, ESLint, Prettier-Konvention)
-
Reaktivitäts-Konzept: Svelte 5 Runes ($state, $derived, $effect) oder Stores
-
Komponenten-Architektur mit Slots, Snippets und Context
-
Build-Optimierung (Tree-Shaking, gezielte Lazy-Loaded Chunks)
-
Optional: Embedding in andere Apps oder als Web-Components
Das liefern wir bei Svelte
- Komponenten-Bibliothek oder Anwendung in Svelte
- Klar dokumentierte Reaktivitäts-Patterns (Runes oder Stores)
- Optimiertes Build-Output mit messbarer Bundle-Reduktion
- Übergabe inkl. README zu Setup, Build und Deployment
Häufige Fragen zu Svelte
Svelte oder React/Vue: Wann ist Svelte sinnvoller?
Was bringen Svelte 5 Runes konkret?
Können Sie Svelte in bestehende Apps einbetten?
Wann brauche ich SvelteKit zusätzlich?
Passende Leistungen
Svelte für Ihr Projekt?
Beschreiben Sie uns Ihre Anforderungen. Wir besprechen, wie die Technologie in Ihr Projekt und Ihre vorhandene Infrastruktur passt.
Projekt besprechen