Ripple - elegante framework de UI con TypeScript
(github.com/trueadm)- Combina las fortalezas de React, Solid y Svelte para construir componentes con un diseño JS/TS-first y su propio lenguaje de módulos
.ripple, como un framework de UI con seguridad de tipos - Apunta a alto rendimiento y eficiencia de memoria con variables/propiedades reactivas usando el prefijo
$, plantillas similares a JSX y renderizado granular - Ofrece extensión para VS Code, Prettier e integración con TypeScript, e incluye DX moderna como arreglos/mapas/sets reactivos, efectos basados en
effecty decoradores (@use) - Actualmente está en alfa temprana y tiene limitaciones como sin soporte para SSR y tipado incompleto; fue abierto para experimentar ideas y compartir feedback
- Basado en una filosofía similar al runtime basado en señales de Svelte 5, permite ver la evolución de los frameworks frontend al experimentar con un enfoque JS/TS-first y una sintaxis amigable para LLM
What is Ripple?
- Ripple es un framework de UI orientado a TypeScript inspirado en React, Solid y Svelte, construido sobre un lenguaje superconjunto que usa su propia extensión
.ripple- Con una sintaxis que encaja bien con JSX, usa plantillas solo dentro del cuerpo del componente y adopta plantillas en forma de sentencias en lugar de expresiones de retorno (return de JSX)
- El autor implementó estas ideas en una forma experimental a partir de su experiencia con Inferno, React Hooks, Lexical y Svelte 5
- Por ahora está en una fase inicial de desarrollo, con muchos bugs y TODOs, y no se recomienda para producción
- Su objetivo es compartir e incubar ideas y explorar la posibilidad de que estas regresen a otros frameworks
- Es un intento de comprobar la hipótesis de que un diseño JS/TS-first ofrece una buena DX tanto para personas como para LLM
Features
- Reactive State Management: ofrece reactividad para variables y propiedades de objetos con el prefijo
$, y los valores derivados también se expresan naturalmente como variables$ - Component-Based Architecture: declaración explícita de componentes con la palabra clave
component, soporte para props/children y combinación con plantillas similares a JSX - Performance: busca rendimiento y eficiencia de memoria de primer nivel en la industria mediante renderizado granular (fine-grained)
- Tooling: integración con TypeScript, IntelliSense/diagnósticos/highlighting en VS Code y soporte de formateo con Prettier
- DX reforzada: filosofía JS/TS-first, sintaxis amigable para LLM y una estructura SPA por defecto
Missing Features
- Sin SSR: por ahora es solo para SPA; SSR todavía no se ha trabajado
- Tipado incompleto: las definiciones de tipos en el codebase son limitadas, con mejoras previstas
Getting Started / Try Ripple
- Se puede abrir la plantilla base en StackBlitz o clonar con
degity ejecutarla con el servidor de desarrollo de Vite- Ejemplo de comandos:
npx degit trueadm/ripple/templates/basic my-app→npm i→npm run dev
- Ejemplo de comandos:
- El playground online está pendiente, pero se puede experimentar localmente con la carpeta
playgrounddel repo
VSCode Extension
- Hay una extensión Ripple for VS Code con soporte para resaltado de sintaxis, diagnósticos en tiempo real, integración con TS y autocompletado (IntelliSense) en archivos
.ripple - Se ofrecen enlaces al paquete publicado en el Marketplace y al paquete
.vsixpara instalación manual
Mounting your app
- Desde la entrada se puede montar el componente raíz con la forma
mount(App, { props, target })- Ofrece una API simple para indicar el nodo DOM en
targete inyectar propiedades iniciales conprops
- Ofrece una API simple para indicar el nodo DOM en
Key Concepts
- Components
- Define componentes declarativos con una firma similar a función usando la palabra clave
component, y escribe directamente la plantilla similar a JSX dentro del cuerpo - Soporta sintaxis abreviada de propiedades (
{onClick}), spread ({...props}) y otras formas familiares
- Define componentes declarativos con una firma similar a función usando la palabra clave
- Reactive Variables
- Las variables y propiedades con prefijo
$tienen reactividad automática y provocan rerender con solo incrementar o asignar - El estado derivado se declara con una notación intuitiva como
$double = $count * 2, y permite derivaciones encadenadas - Con
untrackse puede bloquear la propagación de reactividad en secciones concretas, como durante la inicialización - No se permiten variables reactivas en el ámbito global o en el nivel superior del módulo; deben crearse dentro de un contexto activo de componente
- Las variables y propiedades con prefijo
- Transporting Reactivity
- Al envolver arreglos y objetos, se puede transportar la reactividad más allá de los límites para permitir composición y coexistencia
- Se recomienda el patrón en el que una factory function recibe valores
$, crea internamente derivaciones/effecty luego devuelve valores$
- Reactive Arrays / Set / Map
RippleArray/Set/Mapson colecciones reactivas que extienden las colecciones estándar; para que longitud/tamaño sean reactivos hay que acceder mediante$length/$size- Los resultados de métodos pueden usarse directamente o asignarse a variables reactivas como
$haspara usarlos en plantillas
- Effects
- Con
effect(() => { ... })se declaran side effects que se ejecutan cuando cambian los valores$de los que dependen, con tracking automático
- Con
- Control flow
- Las plantillas se permiten solo dentro del cuerpo del componente y no devuelven JSX como funciones normales o expresiones de asignación
- Dentro de las plantillas se pueden usar declaraciones de variables/llamadas a funciones/
debugger, con un control de flujo centrado en sentencias - Adopta la regla de marcar los literales de cadena como
{ "…" }para distinguirlos del código
- If / For / Try statements
- Usa
if/elsedentro de bloques de plantilla para construir un control de flujo legible - Con
for...ofpermite renderizar colecciones y repetir de forma simple sin necesidad dekeyprop - Los bloques
try/catchpermiten construir error boundaries (UI de fallback); encatchse puede registrar/reportar el error y luego renderizar una UI alternativa
- Usa
- Props
- Las props reactivas usan prefijo
$, y los atributos DOM también deben llevarlo, como$class,$id, para que haya actualizaciones reactivas
- Las props reactivas usan prefijo
- Children
- Proporciona un slot implícito de componente
$children, permitiendo composición con<$children /> - También permite declarar componentes de slot explícitos para ganar legibilidad y control
- Proporciona un slot implícito de componente
- Events
- Soporta una API de eventos similar a React (
onClick,onKeyDown,…Capture) y algunos eventos se optimizan mediante delegación
- Soporta una API de eventos similar a React (
- Decorators
- La sintaxis de decoradores
{@use fn}permite obtener una referencia al nodo real del DOM y devolver hooks de mount/unmount - Soporta patrones de paso de valores reactivos mediante funciones inline o factories, y su propagación a componentes compuestos
- La sintaxis de decoradores
- Styling
- El CSS de ámbito local al componente se escribe en el bloque superior
<style>, ofreciendo estilos encapsulados
- El CSS de ámbito local al componente se escribe en el bloque superior
- Context
- Con
createContextse configuran valores compartidos en el árbol, yget/setsolo se permite dentro de componentes para mantener la previsibilidad
- Con
Playground
- Después de clonar el repo, se puede ejecutar el playground local con
pnpm i && cd playground && pnpm dev- Usando el plugin de Vite, se puede experimentar fácilmente con la sintaxis
.rippleenplayground/src
- Usando el plugin de Vite, se puede experimentar fácilmente con la sintaxis
Why it matters
- Elementos como JS/TS-first, plantillas estilo sentencias y reactividad con prefijo
$son un experimento que busca a la vez una estructura de código amigable para LLM y legibilidad/facilidad de análisis estático - La combinación de renderizado granular, reactividad de colecciones y hooking del DOM mediante decoradores busca compatibilizar microoptimizaciones y DX
- Aunque sigue en fase alfa, cruza la arquitectura basada en señales de Svelte 5 con la experiencia de desarrollo del ecosistema React, aportando referencias para el diseño de frameworks de próxima generación
3 comentarios
Parece bueno, pero a la vez no tanto.
Me da mucho la sensación de que es algo muy al estilo de Svelte.
Después de dar tantas vueltas, capaz que al final termina yéndose por algo tipo React jajaja
Parece que, como la cantidad de contenido con la que se entrenó la IA es poca, se está generando una tendencia en la que todos evitan los frameworks nuevos.
Creo que Svelte fue el último en subirse al tren. Incluso con Svelte, si no escribes bien el prompt, sigue insistiendo en usar la sintaxis con
$en lugar derune, y eso complica las cosas.