Docs Fluixi

Le cœur TC39 Signals

Les primitives que vous avez vues — createSignal, createMemo, createEffect — reposent sur un petit cœur normalisé : une implémentation de la proposition TC39 Signals. Vous en avez rarement besoin directement, mais il est là quand vous voulez l'API la plus bas niveau ou construire vos propres abstractions réactives.

Signal.State

Un signal modifiable — l'équivalent de createSignal :

import { Signal } from '@fluixi/reactive/signal';

const count = new Signal.State(0);

count.get(); // 0
count.set(1);
count.get(); // 1

Il est régi par l'égalité comme createSignal ; passez { equals } pour personnaliser.

Signal.Computed

Un signal dérivé, paresseux et mis en cache — l'équivalent de createMemo :

const doubled = new Signal.Computed(() => count.get() * 2);

doubled.get(); // ne recalcule que lorsque count change

Un computed ne s'exécute que lorsqu'il est lu, et ne recalcule que si une dépendance lue a vraiment changé — le même comportement paresseux et sans incohérence qu'un mémo.

Signal.subtle.Watcher

State et Computed sont tirés par la lecture (pull) : rien ne s'exécute tout seul. Pour réagir avec empressement — la base des effets — utilisez un Watcher. Son rappel se déclenche quand un signal observé a pu changer ; il ne doit pas lire de signaux lui-même, seulement planifier le travail :

let queued = false;
const w = new Signal.subtle.Watcher(() => {
  if (queued) return;
  queued = true;
  queueMicrotask(() => {
    queued = false;
    for (const node of w.getPending()) node.get(); // relire pour stabiliser
    w.watch();                                       // réarmer
  });
});

w.watch(doubled);
count.set(2); // planifie le watcher

getPending() renvoie les signaux observés susceptibles d'avoir changé ; les relire stabilise le graphe, et watch() réarme le watcher. C'est exactement ainsi que createEffect est implémenté en coulisses.

Utilitaires subtle

L'espace de noms Signal.subtle expose aussi untrack(fn) (lire sans s'abonner), currentComputed() (le computed en cours d'évaluation, le cas échéant) et hasSinks(signal) (si un observateur observe un signal).

Pourquoi c'est important

Parce que le cœur suit le modèle TC39, votre état réactif est interopérable et le graphe est introspectable — c'est précisément ce qui alimente le graphe de dépendances en direct du Bac à sable et de @fluixi/devtools.

L'API du quotidien (createSignal et compagnie) est presque toujours ce que vous voulez — mais vous savez désormais ce qu'il y a en dessous.