@cadence-app/core
v0.1.0
Published
Noyau réactif : signaux, computed, effects, scopes, scheduler
Maintainers
Readme
@cadence-app/core
Le noyau réactif de Cadence : signaux, valeurs dérivées,
effets, scopes et ordonnanceur. Zéro dépendance, et aucune API du DOM — queueMicrotask est la
seule fonction d'environnement utilisée, donc le paquet tourne aussi bien dans Node que dans un
navigateur.
Installation
pnpm add @cadence-app/coreLes signaux
Un signal se lit par appel, et s'écrit par set ou update.
import { computed, effect, signal } from '@cadence-app/core';
const price = signal(10);
const quantity = signal(3);
const total = computed(() => price() * quantity());
effect(() => console.log(`total : ${total()}`));
price.set(12);
quantity.update((value) => value + 1);Écrire une valeur identique à la précédente (Object.is) ne notifie personne. Un computed ne
recalcule qu'à la lecture, et seulement après un changement d'une de ses sources.
Les effets
Le premier passage est synchrone. Les suivants sont regroupés par microtâche : dix écritures à la suite ne produisent qu'une réexécution.
const ref = effect((onCleanup) => {
const id = setInterval(tick, 1000);
onCleanup(() => clearInterval(id));
});
ref.dispose();Le nettoyage part avant chaque réexécution, et une dernière fois à la disposition.
Dans un test, flushEffects() vide la file tout de suite, sans attendre la microtâche.
Les scopes
EffectScope regroupe des effets pour les défaire ensemble. Un effet créé dans un scope s'y
enregistre seul.
import { EffectScope, effect } from '@cadence-app/core';
const scope = new EffectScope();
scope.run(() => {
effect(() => render(total()));
});
scope.dispose();Un scope créé à l'intérieur d'un autre devient son enfant : disposer le parent dispose la
descendance. onDispose(callback) ajoute un nettoyage, adopt et drop gèrent un Disposable
venu d'ailleurs.
Licence
MIT
