Zum Inhalt springen
Alle Technologien

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.

Frontend Systemebene
Die Rolle von Svelte im Projekt, schematisch dargestellt.

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.

Umsetzung vergleichenGleiche Aufgabe, andere Werkzeuge
So funktioniert es

$state hält die Werte. $effect erfasst die Eingabe als Abhängigkeit und gibt eine Aufräumfunktion für Timer und Anfrage zurück.

Wann wir es wählen

Passt zu eigenständigen Oberflächen und Werkzeugen, wenn die benötigten Integrationen verfügbar sind und das übernehmende Team Svelte kennt.

Was wir dabei abwägen

Benötigte Komponenten und Schnittstellen prüfen wir vor der Festlegung. Ein kurzer Komponentenquelltext belegt noch keine bessere Gesamtanwendung.

Code in Svelte
TopicSearch.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.

search-source.ts
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 })
  })
}
Die Entscheidung im ProjektReact, Vue und Svelte im Projektvergleich

03 / Vorgehen

So arbeiten wir mit Svelte

  1. Projekt-Setup (Vite-basiert, TypeScript, ESLint, Prettier-Konvention)

  2. Reaktivitäts-Konzept: Svelte 5 Runes ($state, $derived, $effect) oder Stores

  3. Komponenten-Architektur mit Slots, Snippets und Context

  4. Build-Optimierung (Tree-Shaking, gezielte Lazy-Loaded Chunks)

  5. 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?
Wenn Bundle-Size, schneller First Paint oder schlanke Reaktivität echte Anforderungen sind. Auch wenn das Team weniger Boilerplate möchte (kein useState/useEffect-Geflecht, keine Pinia-Stores für jeden globalen State). Bei sehr großem Bedarf an spezialisierten Drittanbieter-Komponenten hat React das größere Ökosystem.
Was bringen Svelte 5 Runes konkret?
Runes ($state, $derived, $effect) ersetzen die alte "magische" Reaktivität von Svelte 3/4 durch explizite Marker. Das ist vorhersagbarer, debugbar und macht die Lernkurve für React-erfahrene Devs flacher. Der Code wirkt jetzt wie eine modernere Variante von Hooks, ohne die typischen Stale-Closure-Probleme.
Können Sie Svelte in bestehende Apps einbetten?
Ja. Svelte-Komponenten lassen sich als Custom Elements / Web Components bauen und in nahezu jede Host-App (React, Vue, klassisches HTML/WordPress) einbetten. Wir nutzen das vor allem für Widgets oder interaktive Inhalte, ohne dass die ganze App auf Svelte migrieren muss.
Wann brauche ich SvelteKit zusätzlich?
Sobald Routing, SSR/SSG, File-basiertes Routing, Form-Actions oder Server-Endpoints ins Spiel kommen. Reines Svelte reicht für eingebettete Widgets und Komponenten-Bibliotheken. Für komplette Sites und Apps ist SvelteKit das richtige Werkzeug.

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