En mode runes, les réactions aux mises à jour d'état sont gérées avec les runes [`$derived`]($derived) et [`$effect`]($effect). En mode legacy, toute déclaration à la racine (par ex. pas dans un bloc ou une fonction) peut être rendue réactive en la préfixant avec un [label](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label) `$:`. Ces déclarations sont exécutées après tout autre code du ` ``` Les déclarations sont ordonnées _topologiquement_ par leurs dépendences et leurs assignations : puisque la déclaration `console.log` dépend de `sum`, `sum` est calculée en premier même si elle apparaît plus loin dans le code. Plusieurs déclarations peuvent être combinée en les mettant dans un bloc : ```js // @noErrors $: { // recalcule `total` lorsque `items` change total = 0; for (const item of items) { total += item.value; } } ``` La partie à gauche d'une assignation réactive peut être un identifiant, ou une assignation de déstructuration : ```js // @noErrors $: ({ larry, moe, curly } = stooges); ``` ## Comprendre les dépendances [!VO]Understanding dependencies Les dépendances d'une déclaration `$:` sont déterminées au moment de la compilation — il s'agit de toutes les variables référencées (mais pas assignées) dans la déclaration. En d'autres termes, une déclaration comme celle-ci ne sera _pas_ rejouée lorsque `count` change, car le compilateur ne peut pas "voir" la dépendance : ```js // @noErrors let count = 0; let double = () => count * 2; $: doubled = double(); ``` De même, l'ordre topologique sera cassé si les dépendances sont référencées indirectement : `z` ne sera jamais mis à jour, car `y` n'est pas considérée comme ayant changé lorsque la mise à jour se produit. Déplacer `$: z = y` en-dessous de `$: setY(x)` permet de corriger le problème : ```svelte ``` ## Code uniquement pour le navigateur [!VO]Browser-only code Les déclarations réactives sont jouées lors du rendu côté serveur ainsi que dans le navigateur. Ceci signifie que tout code qui devrait être uniquement exécuté dans le navigateur devrait être placé dans un bloc `if` : ```js // @noErrors $: if (browser) { document.title = title; } ```