Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ReactとSvelteのその先、Ripple-TS / Beyond React and S...

ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS

Avatar for TOMIKAWA Sotaro

TOMIKAWA Sotaro

May 22, 2026

More Decks by TOMIKAWA Sotaro

Other Decks in Programming

Transcript

  1. 現状の整理 Framework 書き方 更新モデル React JSX 🧱 Virtual DOM Vue.js

    SFC / template / JSX 🧱 Virtual DOM Vue Vapor SFC / JSX ⚡ Fine-grained Svelte SFC風 ⚡ Fine-grained Solid.js JSX ⚡ Fine-grained
  2. Ripple(と TSRX)がある世界 Framework 書き方 更新モデル React JSX / TSRX 🧱

    Virtual DOM Vue.js SFC / template / JSX 🧱 Virtual DOM Vue Vapor SFC / JSX / TSRX ⚡ Fine-grained Svelte SFC風 ⚡ Fine-grained Solid.js JSX / TSRX ⚡ Fine-grained Ripple TSRX ⚡ Fine-grained
  3. TSRXの⽂法 (1 / React) const App__static1 = <div>{'Hello, world!'}</div>; function

    App() { return App__static1; } component App() { <div> "Hello, world!" </div> } compile
  4. TSRXの⽂法 (2) type Props = { name: string }; component

    App({ name }: Props) { <div> "Hello, " {name} "!" </div> }
  5. type Props = { name: string }; component App({ name

    }: Props) { <div> "Hello, " {name} "!" </div> } TSRXの⽂法 (2 / React) type Props = { name: string }; function App({ name }: Props) { return ( <div> {'Hello, '} {name} {'!'} </div> ); } compile
  6. TSRXの⽂法 (3) type Props = { name?: string }; component

    App({ name }: Props) { <div> "Hello, " if (name) { {name} } else { "world" } "!" </div> }
  7. TSRXの⽂法 (3 / React) type Props = { name?: string

    }; component App({ name }: Props) { <div> "Hello, " if (name) { {name} } else { "world" } "!" </div> } type Props = { name?: string }; function App({ name }: Props) { return ( <div> {'Hello, '} {name ? name : 'world'} {'!'} </div> ); } compile
  8. TSRXの⽂法 (scoped-style, for-of, try-catch) component TodoList({ items }) { <ul>

    for (const item of items) { <li>{item}</li> } </ul> <style> .ul { list-style: none; } </style> } component SafeProfile({ userId }) { try { <UserProfile id={userId} /> } catch (error) { <div class="error"> <p> "Something went wrong." </p> </div> } }
  9. Fine-grained reactivityと記法 Fine-grained reactivityの実現には記述方法に制約が生まれがち。 (変数直接アクセス、代入では使用箇所の追跡、変更の検知ができないため) // 変数直接アクセス・代入 let state =

    0; console.log(state); state = 1; // 利用箇所追跡、変更通知可能 const state = createState(0); console.log(state.value); state.value = 1; function createState(init) { let _state = init; return { get value() { return _state; // +追跡処理 }, set value(val) { _state = val; // +変更通知 } }; }
  10. Fine-grained reactivityとTSRX TSRXではLazy destructuring (&{} / &[])と呼ばれる文法を導入して、 JavaScriptのメンタルモデルを極力維持しつつ記法の制限を乗り越える。 // 変数直接アクセス・代入

    let state = 0; console.log(state); state = 1; // 利用箇所追跡、変更通知可能 const &{ value } = createState(0); console.log(value); value = 1; let state = 0; console.log(state); state = 1; const __lazy0 = createState(0); console.log(__lazy0.value); __lazy0.value = 1; compile
  11. Svelte 5の開発から • 独自構文・コンパイル方式でもユーザーは利用する • Signals開発における知見 Reactの開発から • Hooksの構造的な難しさ •

    大規模なReactからの移行難度 ◦ TSRXをフレームワーク移行の中間パスとして利用可能に (Solid.js作者Ryan Carniato氏との対談で言及されている https://www.youtube.com/watch?v=xulUG54CW4c) Dominic Gannaway⽒の視点