La version 5 apporte une syntaxe et un système de réactivité revisités. Bien qu'il paraisse très
différent au premier abord, vous remarquerez très vite des ressemblances. Ce guide passe en revue
les changements de manière détaillée et vous aide à faire votre mise à jour. De plus, nous
fournissons également quelques informations sur _pourquoi_ nous avons fait ces changements.
Vous n'avez pas besoin de migrer vers la nouvelle syntaxe tout de suite — Svelte 5 continue de
supporter la syntaxe de la version 4, et il est possible de mélanger des composants utilisant la
nouvelle syntaxe avec des composants utilisant l'ancienne syntaxe. Nous pensons que beaucoup de gens
seront capables de mettre à jour Svelte en changeant initialement uniquement quelques lignes de
code. Nous proposons également un [script de migration](#Migration-script) qui vous aide avec
beaucoup de ces étapes automatiquement.
## Nouvelle syntaxe de réactivité [!VO]Reactivity syntax changes
La nouvelle API de runes est au coeur de Svelte 5. Les runes sont simplement des instructions pour
le compilateur qui informent Svelte à propos de la réactivité attendue. Syntactiquement, les runes
sont des fonctions dont le nom commence par un `$`.
### let → $state
En Svelte 4, une déclaration `let` à la racine d'un composant était implicitement réactive. En
Svelte 5 les choses sont plus explicites : une variable est réactive lorsqu'elle a créée avec la
rune `$state`. Migrons le compteur ci-dessous en rune en l'entourant d'un `$state` :
```svelte
```
Rien d'autre ne change. `count` est toujours le nombre lui-même, et vous pouvez le lire ou le
modifier directement, sans aucun intermédiaire comme `.value` ou `getCount()`.
> [!DETAILS] Pourquoi ce changement
> Le fait qu'une déclaration `let` à la racine d'un composant soit implicitement réactive
> fonctionnait très bien, mais cela impliquait que la réactivité était contrainte — déclarer un
> `let` à un autre endroit ne le rendait pas réactif. Cela vous forçait à utiliser des stores
> lorsque vous souhaitiez sortir du code d'un composant pour le réutiliser ailleurs. Cela signifiait
> également que vous deviez apprendre un modèle de réactivité complètement distinct, et au final
> cela se révélait souvent moins simple. Puisque la réactivité est plus explicite avec Svelte 5,
> vous pouvez continuer d'utiliser la même API en dehors de la racine des composants. Allez sur le
> [tutoriel](/tutorial) pour en apprendre plus.
### $: → $derived/$effect
Avec Svelte 4, une déclaration `$:` à la racine d'un composant pouvait être utilisée pour déclarer
une dérivation, c-à-d un état entièrement défini par un calcul utilisant un autre état. Avec Svelte
5, ceci s'écrit en utilisant la rune `$derived` :
```svelte
```
Comme avec `$state`, rien d'autre ne change. `double` est toujours le nombre lui-même, et vous
pouvez le lire directement, sans intermédiaire comme `.value` ou `getDouble()`.
Une déclaration `$:` pouvait également être utilisée pour créer des effets de bord. Avec Svelte 5,
nous pouvons le faire en utilisant la rune `$effect` :
```svelte
```
Notez que [les timings d'exécution d'`$effect` ne sont pas les
mêmes]($effect#Understanding-dependencies) que ceux que de `$:`.
> [!DETAILS] Pourquoi ce changement
> `$:` était un raccourci simple et efficace pour débuter : vous pouviez placer un `$:` devant la
> plupart de votre code, et cela fonctionnait. L'intuitivité était également un inconvénient lorsque
> votre code devenait de plus en plus complexe, parce que cela devenait difficile de raisonner sur
> les liens de réactivité entre les différents morceaux de code. L'intention de ce code était-elle
> de créer une dérivation, ou un effet de bord ? Avec `$derived` et `$effect`, vous devez choisir
> entre les deux (spoiler alert : 90% du temps vous voulez `$derived`), mais le futur-vous et les
> autres développeurs et développeuses de votre équipe vous remercieront.
>
> Il y avait également quelques inconvénients difficiles à détecter :
>
> - `$:` ne se mettait à jour que juste avant le rendu, ce qui signifiait que vous pouviez lire des
> valeurs périmées entre deux rendus
> - `$:` n'était exécuté qu'une seule fois par tick, ce qui impliquait que des déclarations
> pouvaient être exécutées moins souvent que vous ne le pensiez
> - les dépendances de `$:` étaient déterminées via analyse statique. Ceci fonctionnait dans la
> plupart des cas, mais pouvait casser de manière subtile au cours d'un refactor lors duquel les
> dépendances sont déplacées dans une fonction et ne sont en conséquence plus visibles
> - les déclarations `$:` étaient également ordonnées en utilisant l'analyse statique des
> dépendances. Dans certains cas, il pouvait y avoir des égalités et l'ordre en résultait mauvais,
> demandant des interventions manuelles. L'ordre pouvait aussi se briser lors d'un refactor qui
> rendrait "invisibles" certaines dépendances
>
> Enfin, cette syntaxe n'était pas vraiment compatible avec TypeScript (notre outillage d'éditeur
> devait faire des circonvolutions pour le rendre compatible avec TypeScript), ce qui était bloquant
> pour rendre le modèle de réactivité de Svelte vraiment universel.
>
> `$derived` et `$effect` résolvent tous ces problèmes :
>
> - ils renvoient toujours la valeur la plus à jour
> - ils sont exécutés aussi souvent que nécéssaire pour rester stable
> - ils déterminent leurs dépendances lors de l'exécution, et sont donc insensibles aux refactors
> - ils exécutent leurs dépendences correctement et sont donc insensibles aux problèmes d'ordre
> - ils sont adaptés à l'utilisation de TypeScript
### export let → $props
Avec Svelte 4, les propriétés d'un composant étaient déclarées en utilisant `export let`. Chaque
propriété nécessitait une déclaration. Avec Svelte 5, toutes les propriétés sont déclarées avec la
rune `$props`, via déstructuration :
```svelte
```
Il y a plusieurs cas dans lesquels la déclaration de propriétés est moins évidente que simplement
déclarer quelques `export let` :
- vous souhaitez renommer la propriété, par exemple parce que le nom est en conflit avec un
identifiant réservé (`class` par ex.)
- vous ne savez pas à l'avance à quelles autres propriétés vous attendre
- vous souhaitez transférer toutes les propriétés à un autre composant
Toutes ces situations nécessitent une syntaxe spéciale avec Svelte 4 :
- renommer : `export { klass as class}`
- autres propriétés : `$$restProps`
- toutes les propriétés : `$$props`
Avec Svelte 5, la rune `$props` rend ces situations plus simples sans ajouter de syntaxe spécifique
à Svelte :
- renommer : utilisez le renommage de propriété `let { class: klass } = $props();`
- autres propriétés : utilisez la décomposition `let { foo, bar, ...rest } = $props();`
- toutes les propriétés : ne déstructurez pas `let props = $props();`
```svelte
```
> [!DETAILS] Pourquoi ce changement
> `export let` était l'un des choix d'API les plus controversés, et il y a eu beaucoup de débats
> autour de si vous deviez pensez aux propriétés comme étant `export`ées ou `import`ées. `$props`
> n'a pas ce problème. De plus, cette syntaxe est alignée avec les autres runes, dont la philosophie
> générale peut se résumer par "toute ce qui est relatif à la réactivité en Svelte est une rune".
>
> Il y avait également beaucoup de limitations liées à `export let`, qui requiert des API
> additionnelles, comme montré plus haut. `$props` réunit toutes ces API en un unique concept
> syntactique qui repose énormément sur la syntaxe JavaScript classique de déstructuration.
## Changements sur les évènements [!VO]Event changes
La gestion des évènements a été refondue avec Svelte 5. Alors qu'avec Svelte 4 il faut utiliser la
directive `:on` pour attacher un gestionnaire d'évènement à un élément, avec Svelte 5 ce ne sont que
des propriétés comme n'importe quelles autres (autrement dit, enlevez le `:`) :
```svelte
```
Puisque ce ne sont que des propriétés, vous pouvez utiliser la syntaxe raccourcie...
```svelte
```
... même si lorsque vous utilisez un gestionnaire d'évènement personnalisé il est généralement
recommandé d'utiliser un nom plus descriptif.
### Évènements de composant [!VO]Component events
Avec Svelte 4, les composants pouvaient émettre des évènements en créant un dispatcher avec
`createEventDispatcher`.
Cette fonction est dépréciée avec Svelte 5. À la place, les composants doivent accepter des _props
de callback_ — ce qui signifie que vous passez des fonctions comme propriétés à ces composants :
```svelte
{
size += power---.detail---;
if (size > 75) burst = true;
}}
---on:---deflate={(power) => {
if (size > 0) size -= power---.detail---;
}}
/>
{#if burst}
💥
{:else}
🎈
{/if}
```
```svelte
Puissance de la pompe : {power}
```
### Remonter des évènements [!VO]Bubbling events
Plutôt que d'écrire `