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

alien-signals と自作 OSS で実現する フレームワーク非依存な ロジック共通化...

Avatar for aose aose
October 25, 2025

alien-signals と自作 OSS で実現する フレームワーク非依存な ロジック共通化の探求 / Exploring Framework-Agnostic Logic Sharing with alien-signals and Custom OSS

Vue Fes Japan 2025(2025/10/25開催)のスポンサーLTでの登壇資料です。

---

マルチプロダクト環境では、似通った処理やロジックを各プロダクトごとに重複実装しがちです。
本セッションでは、"ロジックそのものをフレームワークから切り離し、 Signals をベースとした純粋な TypeScript で一度だけ実装し、各フレームワークで同じ実装を活用する" というアプローチを共有します。
このアプローチを実現するために、 Vue.js 3.6 でも採用される alien-signals をベースとした自作 OSS の『 sigrea 』というライブラリを構築しました。
このライブラリを用いて、フレームワークに依存しないロジックを定義し、各フレームワークへ薄いアダプターで橋渡しする設計方法をお話しします。

---

■ GitHub
- https://github.com/sigrea/core
- https://github.com/sigrea/vue
- https://github.com/sigrea/react

■ npmjs
- https://www.npmjs.com/package/@sigrea/core
- https://www.npmjs.com/package/@sigrea/vue
- https://www.npmjs.com/package/@sigrea/react

■ X (Twitter)
https://x.com/aose_developer

Avatar for aose

aose

October 25, 2025
Tweet

More Decks by aose

Other Decks in Programming

Transcript

  1. sigrea とは? (発⾳:シグリア /sɪɡriə/) • signal ベースの reactive ライブラリ • alien-signals

    ➡ alien-deepsignals ➡ sigrea ② 課題解決のアプローチ - alien-signalsをベースにした⾃作ライブラリ
  2. sigrea の特徴 • Vue の Composition API にかなり近い書き⼼地 ◦ .value,

    .value = XX ◦ signal, deepSignal, computed, watch, ...more ② 課題解決のアプローチ - alien-signalsをベースにした⾃作ライブラリ
  3. sigrea の特徴 • ライフサイクル周りのロジック実装も可能 ◦ defineLogic, onMount, onUnmount • ロジック単体でライフサイクルを含めたテストが書ける

    ◦ mountLogic, cleanupLogic • ※ Nano Stores から着想を得ました ◦ https://github.com/nanostores/nanostores?tab=readme-ov-file#tests ◦ https://github.com/nanostores/nanostores?tab=readme-ov-file#move-logic-from-co mponents-to-stores ② 課題解決のアプローチ - alien-signalsをベースにした⾃作ライブラリ
  4. 各npmパッケージの違い • @sigrea/core …… ロジック定義に必要な関数群 • @sigrea/vue …… Vue 向けのアダプター

    • @sigrea/react …… React 向けのアダプター アダプターは各FWが扱える形に変換する「ロジック翻訳機」 ② 課題解決のアプローチ - alien-signalsをベースにした⾃作ライブラリ
  5. ライフサイクルのズレ 1 ② 課題解決のアプローチ - 同じ開発者体験を実現するために⼯夫したこと • Vue ではコンポーネントの setup()

    が呼ばれた時点で、そのコンポーネントに結び付いた リアクティブな状態とクリーンアップが⾃動的に登録される • アンマウント時には⾃動的にクリーンアップが実⾏される ⬇ • React の StrictMode では「マウント → 即クリーンアップ → 再マウント」が実⾏される • 最後のアンマウント時だけクリーンアップする仕組みを実装した
  6. リアクティブ値の購読⽅式の違い 2 ② 課題解決のアプローチ - 同じ開発者体験を実現するために⼯夫したこと • Vue では外部の状態と繋ぐときは shallowRef

    を使う https://ja.vuejs.org/api/reactivity-advanced#shallowref • React では useSyncExternalStore で「変化を通知する関数」と「最新値を返す関数」 を明⽰的に渡す必要がある https://ja.react.dev/reference/react/useSyncExternalStore#subscribing-to-an-external-store
  7. ロジック再⽣成のタイミング制御 3 ② 課題解決のアプローチ - 同じ開発者体験を実現するために⼯夫したこと • Vue では props

    が変わるたび setup() が再実⾏されて、⾃動的にロジックが差し替わる • React ではいつ再マウントすべきかを⾃⼒で判断しないと古いロジックが残ってしまう ⬇ • 再レンダリング時に「前回の props と同じかどうか」をチェックする仕組みを実装した • これにより、 props に変化があったときだけ新しいロジックへ差し替えることで解決した