Reactive Library

SolidJS

SolidJS sieht aus wie React, verhält sich aber wie ein feingranulares reaktives System. Komponenten werden nur einmal ausgeführt, und Updates fließen direkt an die DOM-Knoten, die von einem Signal abhängen.

intermediate13 min readUpdated 15. Sept. 2026
Counter.jsx
jsx
// Counter.jsx
import { createSignal } from "solid-js";

export function Counter() {
  const [count, setCount] = createSignal(0);

  return (
    <button onClick={() => setCount((c) => c + 1)}>
      Clicked {count()} times
    </button>
  );
}
Veröffentlicht
2021, von Ryan Carniato
Modell
Feingranulare Reaktivität
Rendering
Kein virtueller DOM
Sprache
JSX
State
Signals und Stores
App-Framework
SolidStart

Warum es wichtig ist

Warum Entwickler Solid wählen

Updates nur dort, wo es nötig ist

Signals tracken ihre eigenen Abhängigkeiten. Eine Änderung aktualisiert also exakt die DOM-Knoten, die sie lesen – nichts anderes wird neu gerendert.

Schnell durch Architektur

Ohne virtuellen DOM, der per Diffing abgeglichen werden muss, und mit Komponenten, die nur einmal laufen, belegt Solid konsistent Spitzenplätze in Performance-Benchmarks.

Vertrautes JSX, neue Regeln

Wenn du React kennst, ist die Syntax sofort lesbar. Das mentale Modell hinter der Reaktivität ist das, was du als Nächstes lernst.

Das Gesamtbild

Die drei Grundideen hinter Solid

Feingranulare Signals, Komponenten, die nur einmal ausgeführt werden, und direkte DOM-Updates. Wenn man diese versteht, wirkt Solid nicht mehr wie Magie.

Signals

Reaktivität

Funktionen, die einen Wert halten und jede Berechnung tracken, die sie ausliest.

Komponenten

Setup

Funktionen, die einmal ausgeführt werden, um reaktive Bindungen zu erstellen, nicht bei jedem Update.

Der DOM

Updates

Der Compiler verbindet Signals direkt mit echten DOM-Knoten, sodass Updates jede Diffing-Schicht umgehen.

Solid auf einen Blick

Der Kern von Solid

createSignal

Das Primitive, das einen reaktiven Wert und dessen Setter hält.

createMemo

Ein gecachter, abgeleiteter Wert, der nur neu berechnet wird, wenn seine Abhängigkeiten sich ändern.

createEffect

Führt Side-Effects aus, wenn sich die gelesenen Signals ändern.

createStore

Ein Proxy-basierter Store für tief verschachtelte reaktive Objekte.

Context

Teilt reaktiven State über den Baum hinweg, ohne Prop-Drilling.

Control Flow

Komponenten wie Show, For und Switch handhaben Bedingungen und Listen.

Eine kurze Geschichte

Eine kleine Library mit einer großen Idee

  1. 2019

    Frühe Prototypen

    Ryan Carniato experimentiert mit feingranularer Reaktivität und JSX im Solid-Prototyp.

    19
  2. 2021

    Solid 1.0

    Die Library erreicht ein stabiles Release mit Signals, Stores und einer schlanken Runtime.

    21
  3. 2022

    SolidStart

    Ein offizielles Meta-Framework fügt Routing, Server-Rendering und Data-Loading hinzu.

    22
  4. 2024

    Solid 1.9 und darüber hinaus

    Das Ökosystem reift mit besseren Tools, Dokumentationen und Community-Paketen.

    24
  5. Heute

    Der Benchmark-Favorit

    Solid wird oft als die schnellste Mainstream-Library für reaktive UIs bezeichnet.

    Heute

Der vollständige Leitfaden

SolidJS: Alles was Sie wissen müssen

Was ist SolidJS?

SolidJS ist eine deklarative UI-Library, die wie React aussieht, aber grundlegend anders funktioniert. Sie nutzt JSX und Komponenten, verzichtet jedoch komplett auf einen virtuellen DOM und führt keine Re-Renders durch. Stattdessen setzt sie auf fine-grained reactivity: Signals tracken, wer sie liest, und wenn sich ein Wert ändert, werden nur die Berechnungen und DOM-Knoten aktualisiert, die direkt davon abhängen.

In der Praxis bedeutet das, dass eine Solid-Komponentenfunktion genau einmal ausgeführt wird. Alles Reaktive darin wird während dieses Durchlaufs verdrahtet und anschließend punktgenau aktualisiert. Sobald man dieses Konzept verinnerlicht hat, ergeben sowohl die Performance als auch die Regeln von Solid einen Sinn.

Signals

Ein Signal ist ein reaktiver Wert, der mit createSignal erstellt wird. Es gibt einen Getter und einen Setter zurück.

// Counter.jsx
import { createSignal } from "solid-js";

export function Counter() {
  const [count, setCount] = createSignal(0);

  return (
    <button onClick={() => setCount((c) => c + 1)}>
      Count: {count()}
    </button>
  );
}

Sie lesen ein Signal, indem Sie es aufrufen: count(). Dieser Aufruf registriert die Abhängigkeit. Die Übergabe einer Funktion an den Setter (setCount((c) => c + 1)) ist der sichere Weg, um den Wert basierend auf dem vorherigen Zustand zu aktualisieren.

Abgeleitete Werte mit createMemo

createMemo berechnet einen Wert aus anderen Signals und cached diesen. Die Neuberechnung erfolgt nur, wenn sich eine Abhängigkeit ändert, und das Ergebnis wird zwischen allen Lesern geteilt.

// cart.jsx
import { createSignal, createMemo } from "solid-js";

const [items, setItems] = createSignal([{ price: 10 }, { price: 20 }]);

const total = createMemo(() =>
  items().reduce((sum, item) => sum + item.price, 0),
);

Für einfache Inline-Ausdrücke können Sie auch eine normale Funktion verwenden, aber createMemo vermeidet die mehrfache Ausführung teurer Operationen. Nutzen Sie es, wenn die Berechnung rechenintensiv ist oder an mehreren Stellen gelesen wird.

Effects

createEffect führt einen Side Effect aus, wann immer sich die gelesenen Signals ändern. Es dient der Synchronisation mit der Außenwelt und nicht der Berechnung von Werten.

// title.jsx
import { createEffect, createSignal } from "solid-js";

const [name, setName] = createSignal("Ada");

createEffect(() => {
  document.title = `Hello, ${name()}`;
});

Effects werden nach dem Rendering ausgeführt und tracken ihre Abhängigkeiten automatisch. Verwende onCleanup, um Subscriptions, Timer und Requests aufzuräumen.

Komponenten werden nur einmal ausgeführt

Dies ist die Regel, an der viele React-Entwickler scheitern. Eine Solid-Komponente wird genau einmal ausgeführt. Sie ist eine Setup-Funktion, die reaktive Bindungen erstellt, und keine Funktion, die bei Zustandsänderungen erneut ausgeführt wird.

function Profile(props) {
  // Do not destructure props — that breaks reactivity.
  // Read them where you use them instead.
  return <h1>{props.user.name}</h1>;
}

Da Props reaktive Getter sind, sollten Sie diese dort auslesen, wo Sie sie verwenden (props.user.name), anstatt sie zu destrukturieren. Das Gleiche gilt für Signals: Rufen Sie diese innerhalb des JSX oder innerhalb eines memos auf, nicht einmalig am Anfang der Komponente.

Control-Flow-Komponenten

Solid verwendet anstelle von Template-Direktiven Komponenten für Bedingungen und Listen. Dadurch bleibt alles in JavaScript und der Compiler kann Updates optimieren.

// list.jsx
import { Show, For } from "solid-js";

<Show when={users().length > 0} fallback={<p>No users yet.</p>}>
  <ul>
    <For each={users()}>{(user) => <li>{user.name}</li>}</For>
  </ul>
</Show>

Show rendert seinen Fallback, wenn die Bedingung falsy ist, und For nutzt Referenzen als Keys, sodass DOM-Nodes verschoben werden können, anstatt sie neu zu erstellen. Index steht zur Verfügung, wenn Sie stattdessen den Index als Key verwenden möchten.

Stores

Für verschachtelte reaktive Objekte bietet createStore einen Proxy mit pfadbasierten Updates an.

// store.jsx
import { createStore } from "solid-js/store";

const [user, setUser] = createStore({
  name: "Ada",
  address: { city: "London" },
});

setUser("address", "city", "Paris");

Nur die Teile des Baums, die sich tatsächlich geändert haben, benachrichtigen ihre Abhängigkeiten. Das bedeutet, dass das Aktualisieren einer tief verschachtelten Eigenschaft keine nicht verwandten Lesezugriffe invalidiert. Stores sind der empfohlene Weg, um strukturierten State zu verwalten.

Ressourcen und asynchrone Daten

createResource kapselt eine asynchrone Funktion in einem Signal und bietet Ihnen Lade- und Fehlerzustände, ohne dass Sie diese manuell verwalten müssen.

// user.jsx
import { createResource, Show } from "solid-js";

const [user] = createResource(() => fetch("/api/user").then((r) => r.json()));

<Show when={user()} fallback={<p>Loading…</p>}>
  <h1>{user().name}</h1>
</Show>;

Die Ressource wird erneut ausgeführt, wenn sich ihr Quell-Signal ändert, und bricht veraltete Vorgänge ab. Das macht sie zur idealen Lösung für Daten, die von Routen-Parametern oder Benutzereingaben abhängen.

Routing und SolidStart

Der Solid Router übernimmt die clientseitige Navigation, und SolidStart ist das Meta-Framework, das dateibasiertes Routing, Server Rendering und Data Loading hinzufügt — quasi das Äquivalent zu Next.js für React oder SvelteKit für Svelte. Für alles, was über ein einfaches Widget hinausgeht, solltet ihr mit SolidStart starten.

Best Practices

  • Lies Signals und Props dort aus, wo du sie verwendest; destrukturiere sie niemals vorab.
  • Nutze createMemo für rechenintensive oder häufig gemeinsam genutzte abgeleitete Werte.
  • Nutze createEffect nur für Side Effects und führe das Cleanup mit onCleanup durch.
  • Bevorzuge createStore für verschachtelte Zustände.
  • Nutze Show und For anstelle von manuellen Conditionals und .map.
  • Halte Komponenten als Setup-Funktionen und vermeide es, dich auf eine erneute Ausführung zu verlassen.
  • Nutze createResource für asynchrone Daten, die an reaktive Quellen gebunden sind.

Häufige Fehler

  • Destrukturierung von Props oder Signal-Werten, wodurch die Reaktivität verloren geht.
  • Die Erwartung, dass der Component-Body nach einer Zustandsänderung erneut ausgeführt wird.
  • Verwendung eines Effects zur Berechnung eines Wertes anstelle eines Memos.
  • Vergessen von onCleanup, was zu Leaks bei Subscriptions oder Timern führt.
  • Verwendung von .map in JSX anstelle von For, wodurch Keyed Updates verloren gehen.
  • Die Annahme, dass die Regeln von React gelten, und die Suche nach Hooks, die es nicht gibt.

Wie geht es weiter?

Bei Solid zählt das Verständnis mehr als das Auswendiglernen. Vergleiche das Modell mit React, Vue und Svelte, vertiefe deine Kenntnisse in JavaScript und TypeScript und setze für den Build auf Vite. Baue anschließend eine kleine reaktive App und beobachte, wie wenig davon tatsächlich erneut ausgeführt wird.

State lesen

In Solid ist ein Signal eine Funktion und Komponenten laufen nur einmal. Das Destructuring von Props oder State bricht die Reaktivität.

Bevorzugt
const [count, setCount] = createSignal(0);

// read it as a function
<p>{count()}</p>
Vermeiden
const [count, setCount] = createSignal(0);
const value = count(); // captured once

<p>{value}</p>

Abgeleitete Werte

Nutze createMemo für Werte, die von Signals abgeleitet werden, damit die Berechnung gecacht und geteilt wird.

Bevorzugt
const [items, setItems] = createSignal([1, 2, 3]);
const total = createMemo(() =>
  items().reduce((a, b) => a + b, 0),
);
Vermeiden
const [items, setItems] = createSignal([1, 2, 3]);
const total = () =>
  items().reduce((a, b) => a + b, 0);
// recomputes on every read

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, SolidJS zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch SolidJS — mit Quizzen und echtem Code, den Sie im Browser ausführen können.