Ripple – ein elegantes TypeScript-UI-Framework
(github.com/trueadm)- Ein typsicheres UI-Framework, das die Stärken von React, Solid und Svelte vereint und Komponenten mit einem JS/TS-first-Design sowie einer eigenen Modulsprache auf Basis von
.rippleerstellt - Setzt auf reaktive Variablen/Properties mit dem Präfix
$, JSX-ähnliche Templates und feingranulares Rendering, um hohe Performance und Speichereffizienz zu erreichen - Bietet eine VS Code-Erweiterung, Prettier und TypeScript-Integration und umfasst moderne DX wie reaktive Arrays, Maps und Sets,
effect-basierte Side Effects sowie Dekoratoren (@use) - Derzeit in einer frühen Alpha-Phase mit Einschränkungen wie fehlendem SSR und unvollständigen Typen; offen veröffentlicht zum Experimentieren mit Ideen und zum Teilen von Feedback
- Baut auf einer ähnlichen Philosophie wie die signalbasierte Runtime von Svelte 5 auf und zeigt mit seinem JS/TS-first-Ansatz und einer LLM-freundlichen Syntax, wohin sich Frontend-Frameworks entwickeln könnten
What is Ripple?
- Ripple ist ein von React, Solid und Svelte inspiriertes TypeScript-first-UI-Framework, das auf einer Superset-Sprache mit der eigenen Erweiterung
.rippleaufbaut- Mit einer Syntax, die gut zu JSX passt, werden Templates nur innerhalb des Komponentenrumpfs verwendet; statt eines Rückgabeausdrucks (JSX-Return) setzt Ripple auf statement-basierte Templates
- Der Autor hat die Ideen auf Basis seiner Erfahrungen mit Inferno, React Hooks, Lexical, Svelte 5 und anderen in experimenteller Form umgesetzt
- Aktuell befindet sich das Projekt in einer frühen Entwicklungsphase mit vielen Bugs und TODOs und wird nicht für den Produktionseinsatz empfohlen
- Ziel ist das Teilen und Inkubieren von Ideen sowie die Erkundung, wie sie in andere Frameworks zurückfließen könnten
- Es ist ein Versuch, die Hypothese zu prüfen, dass ein JS/TS-first-Design sowohl Menschen als auch LLMs eine gute DX bietet
Features
- Reactive State Management: Reaktivität für Variablen und Objekt-Properties mit dem Präfix
$; auch abgeleitete Werte lassen sich natürlich als$-Variablen ausdrücken - Component-Based Architecture: Explizite Komponentendeklaration mit dem Schlüsselwort
component, Unterstützung für props/children und Kombination mit JSX-ähnlichen Templates - Performance: Feingranulares Rendering zielt auf branchenführende Performance und Speichereffizienz
- Tooling: TypeScript-Integration, VS Code-IntelliSense/Diagnosen/Highlighting sowie Unterstützung für Prettier-Formatierung
- Verbesserte DX: JS/TS-first-Philosophie, LLM-freundliche Syntax und eine SPA-first-Struktur
Missing Features
- Kein SSR: Aktuell nur für SPA, an SSR wurde bisher noch nicht gearbeitet
- Unvollständige Typen: Die Typdefinitionen in der Codebasis sind noch begrenzt und sollen verbessert werden
Getting Started / Try Ripple
- Das Basistemplate kann in StackBlitz geöffnet oder mit
degitgeklont und dann über den Vite-Entwicklungsserver ausgeführt werden- Beispielablauf:
npx degit trueadm/ripple/templates/basic my-app→npm i→npm run dev
- Beispielablauf:
- Ein Online-Playground ist geplant; lokales Experimentieren ist bereits über den Ordner
playgroundim Repository möglich
VSCode Extension
- Es gibt die Erweiterung Ripple for VS Code mit Syntax-Highlighting, Live-Diagnosen, TS-Integration und Autovervollständigung (IntelliSense) für
.ripple-Dateien - Es werden Links sowohl zur Marketplace-Version als auch zum
.vsix-Paket für die manuelle Installation bereitgestellt
Mounting your app
- Im Einstiegspunkt wird das Einhängen der Root-Komponente in der Form
mount(App, { props, target })unterstützt- Eine schlanke API erlaubt es, mit
targeteinen DOM-Knoten festzulegen und überpropsanfängliche Eigenschaften zu injizieren
- Eine schlanke API erlaubt es, mit
Key Concepts
- Components
- Mit dem Schlüsselwort
componentwerden deklarative Komponenten mit funktionsähnlicher Signatur definiert; JSX-ähnliche Templates werden direkt im Komponentenrumpf beschrieben - Unterstützt werden Kurzschreibweisen für Properties (
{onClick}), Spread ({...props}) und andere vertraute Syntaxelemente
- Mit dem Schlüsselwort
- Reactive Variables
- Variablen und Properties mit dem Präfix
$sind automatisch reaktiv; Inkrementieren oder Zuweisen allein löst ein Re-Rendering aus - Abgeleiteter State wird mit intuitiver Schreibweise wie
$double = $count * 2deklariert; auch verkettete Ableitungen sind möglich - Mit
untracklässt sich in bestimmten Bereichen wie der Initialisierung die Ausbreitung von Reaktivität unterbinden - Auf globaler Ebene bzw. auf Modulebene sind reaktive Variablen verboten; sie müssen immer in einem aktiven Komponenten-Kontext erzeugt werden
- Variablen und Properties mit dem Präfix
- Transporting Reactivity
- Durch das Wrappen von Arrays und Objekten lässt sich Reaktivität über Grenzen hinweg transportieren, wodurch Komposition und Koexistenz möglich werden
- Empfohlen wird ein Muster, bei dem Factory-Funktionen
$-Werte annehmen, intern Ableitungen/effecterzeugen und dann erneut$-Werte zurückgeben
- Reactive Arrays / Set / Map
RippleArray/Set/Mapsind reaktive Collections, die Standard-Collections erweitern; auf Länge bzw. Größe muss über$length/$sizezugegriffen werden, damit es reaktiv bleibt- Methodenergebnisse können direkt verwendet oder wie bei
$hasreaktiven Variablen zugewiesen und dann im Template genutzt werden
- Effects
- Mit
effect(() => { ... })werden Side Effects deklariert, die bei Änderungen abhängiger$-Werte ausgeführt werden; das Tracking erfolgt automatisch
- Mit
- Control flow
- Templates sind nur innerhalb des Komponentenrumpfs erlaubt; normale Funktionen oder Variablenzuweisungen geben JSX nicht direkt zurück
- Innerhalb von Templates sind Variablendeklarationen, Funktionsaufrufe und
debuggererlaubt; der Kontrollfluss ist statement-zentriert - String-Literale werden explizit als
{ "…" }geschrieben, um sie von Code zu unterscheiden
- If / For / Try statements
if/elsekann innerhalb von Template-Blöcken verwendet werden, um gut lesbare Kontrollflüsse zu bildenfor...ofunterstützt das Rendern von Collections in einer knappen Form ohnekey-Prop- Mit
try/catchlassen sich Error Boundaries (Fallback-UI) aufbauen; incatchkann nach Logging/Reporting eine alternative UI gerendert werden
- Props
- Reaktive Props verwenden das Präfix
$; auch DOM-Attribute wie$classund$idmüssen das Präfix tragen, damit reaktive Updates funktionieren
- Reaktive Props verwenden das Präfix
- Children
- Es gibt einen impliziten
$children-Komponenten-Slot; mit<$children />lässt sich Komposition umsetzen - Auch explizite Slot-Komponenten können deklariert werden, was Lesbarkeit und Kontrolle verbessert
- Es gibt einen impliziten
- Events
- Unterstützt wird eine React-ähnliche Event-API (
onClick,onKeyDown,…Capture); einige Events sind per Delegation optimiert
- Unterstützt wird eine React-ähnliche Event-API (
- Decorators
- Mit der Dekorator-Syntax
{@use fn}lässt sich eine Referenz auf den echten DOM-Knoten erhalten und es können Mount-/Unmount-Hooks zurückgegeben werden - Unterstützt werden Muster zur Weitergabe reaktiver Werte über Inline-Funktionen/Factorys sowie deren Weitergabe an zusammengesetzte Komponenten
- Mit der Dekorator-Syntax
- Styling
- Lokal gescoptes CSS einer Komponente wird in einem Top-Level-Block
<style>geschrieben und bietet gekapseltes Styling
- Lokal gescoptes CSS einer Komponente wird in einem Top-Level-Block
- Context
- Mit
createContextlassen sich Werte im Komponentenbaum teilen; get/set ist nur innerhalb von Komponenten erlaubt, was die Vorhersagbarkeit erhöht
- Mit
Playground
- Nach dem Klonen des Repos kann mit
pnpm i && cd playground && pnpm devein lokaler Playground gestartet werden- Mit dem Vite-Plugin lassen sich in
playground/srcbequem Experimente mit der.ripple-Syntax durchführen
- Mit dem Vite-Plugin lassen sich in
Why it matters
- JS/TS-first, statement-basierte Templates und $-präfixierte Reaktivität sind ein Experiment, das zugleich LLM-freundliche Code-Strukturen sowie Lesbarkeit und einfache statische Analyse anstrebt
- Die Kombination aus feingranularem Rendering, Reaktivität für Collections und DOM-Hooking über Dekoratoren ist ein Versuch, mikrooptimierte Performance und DX zusammenzubringen
- Obwohl sich Ripple noch in der Alpha-Phase befindet, liefert es durch die Gegenüberstellung des signalbasierten Ansatzes von Svelte 5 mit der Developer Experience des React-Ökosystems interessante Anhaltspunkte für das Design der nächsten Framework-Generation
3 Kommentare
Scheint gut zu sein, aber irgendwie auch nicht.
Irgendwie hat es für mich stark dieses Svelte-Gefühl.
Am Ende landet man dann nach einigen Umwegen vielleicht doch wieder bei etwas React-Ähnlichem, haha
Es scheint einen Trend zu geben, dass alle neuen Frameworks eher meiden, weil die Menge an Material, mit dem die AI trainiert wurde, zu gering ist.
Ich denke, Svelte hat gerade noch den letzten Zug erwischt. Sogar bei Svelte ist es problematisch, weil es ohne gut formulierte Prompts ständig ohne
runeauskommen will und stattdessen mit der$-Syntax ankommt.