11 poin oleh GN⁺ 2025-09-09 | 3 komentar | Bagikan ke WhatsApp
  • Framework UI yang type-safe untuk membangun komponen dengan menggabungkan kelebihan React·Solid·Svelte, desain yang mengutamakan JS/TS, dan bahasa modul .ripple miliknya sendiri
  • Menargetkan performa tinggi dan efisiensi memori melalui variabel/properti reaktif dengan prefiks $, template mirip JSX, dan rendering granular
  • Menyediakan ekstensi VS Code, Prettier, dan integrasi TypeScript, serta mencakup DX modern seperti array·map·set reaktif, side effect berbasis effect, dan decorator (@use)
  • Saat ini masih alpha awal dengan keterbatasan seperti belum mendukung SSR dan type yang belum lengkap, dibuka untuk eksperimen ide dan berbagi umpan balik
  • Berdasarkan filosofi yang mirip dengan runtime berbasis signal milik Svelte 5, proyek ini menunjukkan arah evolusi framework frontend melalui pendekatan JS/TS-first dan sintaks yang ramah LLM

What is Ripple?

  • Ripple adalah framework UI yang mengutamakan TypeScript dan terinspirasi dari React·Solid·Svelte, dibangun di atas bahasa superset yang menggunakan ekstensi .ripple miliknya sendiri
    • Dengan sintaks yang cocok dengan JSX, Ripple menggunakan template hanya di dalam body komponen dan mengadopsi template bergaya statement alih-alih ekspresi return (return JSX)
    • Penulisnya mengimplementasikan ide ini dalam bentuk eksperimental berdasarkan pengalaman di Inferno·React Hooks·Lexical·Svelte 5
  • Saat ini masih berada pada tahap pengembangan awal, dengan banyak bug dan TODO, sehingga tidak direkomendasikan untuk penggunaan produksi
    • Tujuannya adalah berbagi ide dan inkubasi, serta mengeksplorasi kemungkinan umpan balik balik ke framework lain
    • Ini juga merupakan upaya untuk memverifikasi hipotesis bahwa desain JS/TS-first dapat memberikan DX yang baik bagi manusia maupun LLM

Features

  • Reactive State Management: Menyediakan reaktivitas variabel dan properti objek dengan prefiks $, dan nilai turunan juga dapat ditulis secara alami sebagai variabel $
  • Component-Based Architecture: Deklarasi komponen eksplisit dengan keyword component, mendukung props/children dan dipadukan dengan template mirip JSX
  • Performance: Mengincar performa dan efisiensi memori kelas atas di industri melalui rendering granular (fine-grained)
  • Tooling: Mendukung integrasi TypeScript, IntelliSense/diagnostik/highlighting di VS Code, serta formatting Prettier
  • Penguatan DX: Filosofi JS/TS-first, sintaks ramah LLM, dan struktur dasar SPA

Missing Features

  • Belum ada SSR: Saat ini khusus SPA, SSR belum dikerjakan
  • Type belum lengkap: Definisi type dalam codebase masih terbatas dan direncanakan akan ditingkatkan

Getting Started / Try Ripple

  • Template dasar dapat dibuka di StackBlitz atau di-clone dengan degit lalu dijalankan lewat server pengembangan Vite
    • Contoh perintah: npx degit trueadm/ripple/templates/basic my-appnpm inpm run dev
  • Playground online akan ditambahkan, dan eksperimen lokal dapat dilakukan melalui folder playground di repo

VSCode Extension

  • Tersedia ekstensi Ripple for VS Code yang mendukung syntax highlighting, diagnostik real-time, integrasi TS, dan autocompletion (IntelliSense) untuk file .ripple
  • Tersedia tautan untuk versi Marketplace dan paket .vsix untuk instalasi manual

Mounting your app

  • Mendukung pemasangan komponen root di entry dengan bentuk mount(App, { props, target })
    • Menyediakan API yang ringkas untuk menentukan node DOM pada target dan menyuntikkan properti awal melalui props

Key Concepts

  • Components
    • Mendefinisikan komponen deklaratif dengan signature mirip fungsi melalui keyword component, dan menulis template mirip JSX langsung di dalam body
    • Mendukung singkatan properti ({onClick}), spread ({...props}), dan sintaks yang familier lainnya
  • Reactive Variables
    • Variabel dan properti dengan prefiks $ memiliki reaktivitas otomatis, dan increment/assignment saja sudah memicu re-render
    • State turunan dideklarasikan dengan notasi intuitif seperti $double = $count * 2, dan turunan berantai juga dimungkinkan
    • Dengan untrack, propagasi reaktivitas dapat diblokir pada bagian tertentu seperti saat inisialisasi
    • Variabel reaktif dilarang di global/modul top-level, dan harus dibuat dalam konteks komponen aktif
  • Transporting Reactivity
    • Reaktivitas dapat dibawa melintasi boundary melalui pembungkusan array dan objek sehingga komposisi dan koeksistensi dimungkinkan
    • Disarankan pola di mana factory function menerima nilai $, membuat turunan/effect di dalamnya, lalu mengembalikan nilai $ lagi
  • Reactive Arrays / Set / Map
    • RippleArray/Set/Map adalah koleksi reaktif yang memperluas koleksi standar; panjang/ukuran harus diakses melalui $length/$size agar tetap reaktif
    • Hasil method dapat digunakan langsung atau ditugaskan ke variabel reaktif seperti $has untuk dipakai di template
  • Effects
    • Mendeklarasikan side effect dengan effect(() => { ... }) yang berjalan saat nilai $ yang menjadi dependensi berubah, dengan tracking otomatis
  • Control flow
    • Template hanya diizinkan di dalam body komponen, dan tidak mengembalikan JSX itu sendiri dari fungsi biasa atau ekspresi assignment variabel
    • Di dalam template, dapat digunakan deklarasi variabel/pemanggilan fungsi/debugger, dengan alur kontrol yang berpusat pada statement
    • Mengadopsi aturan bahwa literal string harus ditulis sebagai { "…" } untuk membedakannya dari kode
  • If / For / Try statements
    • Menggunakan if/else di dalam blok template untuk membentuk alur kontrol yang mudah dibaca
    • Mendukung rendering koleksi dengan for...of, dengan iterasi ringkas yang tidak memerlukan key prop
    • Dengan blok try/catch, bisa membangun error boundary (fallback UI), lalu melakukan logging/reporting di catch sebelum merender UI pengganti
  • Props
    • Prop reaktif menggunakan prefiks $, dan atribut DOM juga harus diberi prefiks seperti $class, $id agar update reaktif bekerja
  • Children
    • Menyediakan slot komponen implisit $children, dan komposisi dapat dibuat dengan <$children />
    • Juga memungkinkan deklarasi komponen slot eksplisit untuk meningkatkan keterbacaan dan kontrol
  • Events
    • Mendukung API event mirip React (onClick, onKeyDown, …Capture), dan beberapa event dioptimalkan dengan delegation
  • Decorators
    • Dengan sintaks decorator {@use fn}, bisa memperoleh referensi node DOM nyata dan mengembalikan hook mount/unmount
    • Mendukung pola pengiriman nilai reaktif melalui inline function/factory, serta penerusan ke komponen komposit
  • Styling
    • Menulis CSS bercakupan lokal ke komponen di blok top-level &lt;style&gt;, menyediakan styling yang terenkapsulasi
  • Context
    • Dengan createContext, dapat menetapkan nilai bersama di pohon atas-bawah, dan get/set hanya diizinkan di dalam komponen untuk menjaga prediktabilitas

Playground

  • Setelah meng-clone repo, playground lokal dapat dijalankan dengan pnpm i && cd playground && pnpm dev
    • Dengan plugin Vite, eksperimen sintaks .ripple di playground/src dapat dilakukan dengan mudah

Why it matters

  • JS/TS-first, template bergaya statement, dan reaktivitas berprefiks $ adalah eksperimen untuk sekaligus mengejar struktur kode yang ramah LLM dan kemudahan keterbacaan/analisis statis
  • Kombinasi seperti rendering granular, reaktivitas koleksi, dan hooking DOM lewat decorator merupakan upaya untuk menyeimbangkan optimalisasi halus dan DX
  • Meski masih tahap alpha, Ripple menawarkan referensi bagi desain framework generasi berikutnya dengan memverifikasi silang alur berbasis signal ala Svelte 5 dan pengalaman pengembang dari ekosistem React

3 komentar

 
aabb2467 2025-09-09

Sepertinya bagus, tapi juga terasa tidak begitu.

 
ng0301 2025-09-09

Rasanya cukup kuat seperti Svelte.
Pada akhirnya, jangan-jangan nanti malah berujung jadi React-like wkwk

 
click 2025-09-09

Sepertinya karena porsi materi yang dipelajari AI masih sedikit, jadi muncul kecenderungan orang-orang enggan memakai framework baru.
Saya rasa Svelte adalah kereta terakhir yang sempat terkejar. Bahkan Svelte pun, kalau prompt-nya tidak ditulis dengan baik, sering kali malah menyerang dengan sintaks $ tanpa memakai rune, jadi merepotkan.