This is the developer documentation for Svelte.
# Aperçu
Svelte est un framework permettant de construire des interfaces sur le web. Il utilise un
compilateur pour transformer les composants écrits en HTML, CSS et JavaScript...
```svelte
```
... en du code JavaScript léger et optimisé.
Vous pouvez vous en servir pour construire ce que vous voulez sur le web, depuis des composants
isolés jusqu'à des applications full-stack ambitieuses (en utilisant le framework d'application
compagnon de Svelte, [SvelteKit](../kit)) et tout ce que vous pouvez imaginer entre les deux.
Ces pages servent de documentation de référence. Si vous débutez avec Svelte, nous vous recommandons
de commencer par le [tutoriel interactif](/tutorial) et de revenir ici lorsque vous aurez des
questions.
Vous pouvez aussi essayer Svelte directement dans le [bac à sable](/playground) ou sur
[StackBlitz](https://sveltekit.new), s'il vous faut un environnement plus complet.
# Débuter avec Svelte
Nous recommandons d'utiliser [SvelteKit](../kit), le framework d'application officiel développé par
l'équipe Svelte, qui se base sur [Vite](https://vite.dev) :
```bash
npx sv create myapp
cd myapp
npm install
npm run dev
```
Ne vous inquiétez pas si vous ne connaissez pas encore Svelte ! Vous pouvez dans un premier temps
ignorer toutes les choses merveilleuses que SvelteKit apporte et vous y intéresser plus tard.
## Alternatives à SvelteKit [!VO]Alternatives to SvelteKit
Vous pouvez aussi utiliser Svelte directement avec Vite en exécutant `npm create vite@latest` et en
choisissant l'option `svelte`. De cette manière, `npm run build` va générer des fichiers HTML, JS et
CSS dans le dossier `dist` grâce à
[vite-plugin-svelte](https://github.com/sveltejs/vite-plugin-svelte). Dans la plupart des cas vous
aurez également certainement besoin de choisir une [librairie de routing](faq#Is-there-a-router).
Il existe également des plugins pour [Rollup](https://github.com/sveltejs/rollup-plugin-svelte),
[Webpack](https://github.com/sveltejs/svelte-loader) [et quelques
autres](https://sveltesociety.dev/packages?category=build-plugins), mais nous recommandons
l'utilisation de Vite.
## Outillage des éditeurs [!VO]Editor tooling
L'équipe de Svelte maintient une [extension VS
Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode), et des intégrations
sont également disponibles pour d'autres
[éditeurs](https://sveltesociety.dev/resources#editor-support) et outils.
Vous pouvez aussi vérifier la qualité de votre code dans votre terminal en utilisant [sv
check](https://github.com/sveltejs/cli).
## Obtenir de l'aide [!VO]Getting help
N'ayez pas peur de demander de l'aide dans le forum de discussion de notre serveur [Discord](/chat)
! Vous pourrez aussi trouver des réponses sur [Stack
Overflow](https://stackoverflow.com/questions/tagged/svelte).
# Fichiers .svelte
Les composants sont les briques de base des application Svelte. Ils sont écrits dans des fichiers
`.svelte`, en utilisant une version augmentée de HTML.
Les trois sections — script, styles, et markup — sont optionnelles.
```svelte
/// file: MyComponent.svelte
```
## `
```
Vous pouvez `export`er des liaisons depuis ce bloc, elles deviendront des exports du module copmilé.
Vous ne pouvez pas utiliser `export default`, puisque l'export par défaut est le composant lui-même.
> [!NOTE] Si vous utilisez TypeScript et importez dans un fichier `ts` de tels exports depuis un
> bloc `module`, assurez-vous que votre éditeur soit configuré correctement pour permettre à
> TypeScript d'avoir conscience de ces exports. C'est le cas avec notre extension VSCode et avec le
> plugin IntelliJ, mais dans d'autres cas vous aurez peut-être besoin de configurer notre [plugin
> d'éditeur dédié à TypeScript](https://www.npmjs.com/package/typescript-svelte-plugin).
> [!LEGACY]
> Avec Svelte 4, cette balise script se définit en utilisant `
```
You can specify a fallback value for a prop. It will be used if the component's consumer doesn't specify the prop on the component when instantiating the component, or if the passed value is `undefined` at some point.
```svelte
```
To get all properties, use rest syntax:
```svelte
```
You can use reserved words as prop names.
```svelte
```
If you're using TypeScript, you can declare the prop types:
```svelte
```
If you're using JavaScript, you can declare the prop types using JSDoc:
```svelte
```
If you export a `const`, `class` or `function`, it is readonly from outside the component.
```svelte
```
Readonly props can be accessed as properties on the element, tied to the component using [`bind:this` syntax](bindings#bind:this).
### Reactive variables
To change component state and trigger a re-render, just assign to a locally declared variable that was declared using the `$state` rune.
Update expressions (`count += 1`) and property assignments (`obj.x = y`) have the same effect.
```svelte
```
Svelte's `
```
If you'd like to react to changes to a prop, use the `$derived` or `$effect` runes instead.
```svelte
```
For more information on reactivity, read the documentation around runes.
# Reactivity fundamentals
Reactivity is at the heart of interactive UIs. When you click a button, you expect some kind of response. It's your job as a developer to make this happen. It's Svelte's job to make your job as intuitive as possible, by providing a good API to express reactive systems.
## Runes
Svelte 5 uses _runes_, a powerful set of primitives for controlling reactivity inside your Svelte components and inside `.svelte.js` and `.svelte.ts` modules.
Runes are function-like symbols that provide instructions to the Svelte compiler. You don't need to import them from anywhere — when you use Svelte, they're part of the language.
The following sections introduce the most important runes for declare state, derived state and side effects at a high level. For more details refer to the later sections on [state](state) and [side effects](side-effects).
## `$state`
Reactive state is declared with the `$state` rune:
```svelte
```
You can also use `$state` in class fields (whether public or private):
```js
// @errors: 7006 2554
class Todo {
done = $state(false);
text = $state();
constructor(text) {
this.text = text;
}
}
```
> [!LEGACY]
> In Svelte 4, state was implicitly reactive if the variable was declared at the top level
>
> ```svelte
>
>
>
> ```
## `$derived`
Derived state is declared with the `$derived` rune:
```svelte
{count} doubled is {doubled}
```
The expression inside `$derived(...)` should be free of side-effects. Svelte will disallow state changes (e.g. `count++`) inside derived expressions.
As with `$state`, you can mark class fields as `$derived`.
> [!LEGACY]
> In Svelte 4, you could use reactive statements for this.
>
> ```svelte
>
>
>
>
>
{count} doubled is {doubled}
> ```
>
> This only worked at the top level of a component.
## `$effect`
To run _side-effects_ when the component is mounted to the DOM, and when values change, we can use the `$effect` rune ([demo](/playground/untitled#H4sIAAAAAAAAE31T24rbMBD9lUG7kAQ2sbdlX7xOYNk_aB_rQhRpbAsU2UiTW0P-vbrYubSlYGzmzMzROTPymdVKo2PFjzMzfIusYB99z14YnfoQuD1qQh-7bmdFQEonrOppVZmKNBI49QthCc-OOOH0LZ-9jxnR6c7eUpOnuv6KeT5JFdcqbvbcBcgDz1jXKGg6ncFyBedYR6IzLrAZwiN5vtSxaJA-EzadfJEjKw11C6GR22-BLH8B_wxdByWpvUYtqqal2XB6RVkG1CoHB6U1WJzbnYFDiwb3aGEdDa3Bm1oH12sQLTcNPp7r56m_00mHocSG97_zd7ICUXonA5fwKbPbkE2ZtMJGGVkEdctzQi4QzSwr9prnFYNk5hpmqVuqPQjNnfOJoMF22lUsrq_UfIN6lfSVyvQ7grB3X2mjMZYO3XO9w-U5iLx42qg29md3BP_ni5P4gy9ikTBlHxjLzAtPDlyYZmRdjAbGq7HprEQ7p64v4LU_guu0kvAkhBim3nMplWl8FreQD-CW20aZR0wq12t-KqDWeBywhvexKC3memmDwlHAv9q4Vo2ZK8KtK0CgX7u9J8wXbzdKv-nRnfF_2baTqlYoWUF2h5efl9-n0O6koAMAAA==)):
```svelte
```
The function passed to `$effect` will run when the component mounts, and will re-run after any changes to the values it reads that were declared with `$state` or `$derived` (including those passed in with `$props`). Re-runs are batched (i.e. changing `color` and `size` in the same moment won't cause two separate runs), and happen after any DOM updates have been applied.
> [!LEGACY]
> In Svelte 4, you could use reactive statements for this.
>
> ```svelte
>
>
>
> ```
>
> This only worked at the top level of a component.
# C’est quoi une rune ?
> [!NOTE] **rune** /ro͞on/ _nom_
>
> Une lettre ou caractère graphique utilisé comme symbole magique ou mystique.
Les runes sont les symboles utilisés dans les fichiers `.svelte` et `.svelte.js`/`.svelte.ts` pour
contrôler le compilateur Svelte. Si vous pensez Svelte comme un langage, les runes font partie de sa
syntaxe — elles sont des _mots-clés_.
Les runes ont un préfixe `$` et ressemblent à des fonctions :
```js
let message = $state('coucou');
```
Néanmoins, elles diffèrent des fonctions JavaScript habituelles de manière importante :
- Vous n'avez pas besoin de les importer — elles font partie du langage
- Elles ne représentent pas de valeurs — vous ne pouvez pas les assigner à une variable ou les
passer comme argument à une fonction
- Comme pour les mots-clés JavaScript, elles ne sont valides que dans certaines positions (le
compilateur vous préviendra si vous les utilisez au mauvais endroit)
> [!LEGACY]
> Les runes n'existaient pas avant Svelte 5.
# $state
La rune `$state` vous permet de créer un _état réactif_, ce qui signifie que votre UI _réagit_
lorsque cet état évolue.
```svelte
```
À la différence d'autres frameworks que vous avez peut-être croisés, il n'y a pas d'API pour
interagir avec un état — `count` est juste un nombre, et non un objet ou une fonction, et vous
pouvez le mettre à jour comme vous mettriez à jour n'importe quelle variable.
### L'état profond [!VO]Deep state
Si `$state` est utilisé avec un tableau ou un objet simple, le résultat est un _proxy d'état_
profondément réactif. Les
[Proxys](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
permettent à Svelte d'exécuter du code lors de la lecture ou de l'écriture de propriétés, en
particulier via des méthodes comme `array.push(...)`, déclenchant des mises à jour granulaires.
> [!NOTE] Les classes comme `Set` et `Map` ne seront pas transformées en Proxy, mais Svelte fournit
> des implémentations réactives pour plusieurs built-ins similaires que vous pouvez importer depuis
> [`svelte/reactivity`](./svelte-reactivity).
L'état est transformé en Proxy de manière récursive jusqu'à ce que Svelte trouve autre chose qu'un
tableau ou un objet simple. Dans un cas comme celui-là...
```js
let todos = $state([
{
done: false,
text: 'ajouter plus de todos'
}
]);
```
... modifier une propriété d'un élément individuel du tableau va déclencher des mises à jour pour
tous les éléments de votre UI qui dépendent spécifiquement de cette propriété :
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos[0].done = !todos[0].done;
```
Si vous ajoutez un nouvel objet à ce tableau via `.push`, celui-ci sera également transformé en
Proxy :
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos.push({
done: false,
text: 'déjeuner'
});
```
> [!NOTE] Lorsque vous mettez à jour les propriétés d'un Proxy, l'objet d'origine n'est _pas_ muté.
Notez que si vous déstructurez une valeur réactive, les références ne sont pas réactives — comme
pour du JavaScript classique, elles sont évaluées au moment de la déstructuration :
```js
let todos = [{ done: false, text: 'ajouter plus de tâches' }];
// ---cut---
let { done, text } = todos[0];
// ceci n'affectera pas la valeur de `done`
todos[0].done = !todos[0].done;
```
### Classes
Vous pouvez aussi utiliser `$state` avec les champs d'une classe (qu'ils soient publics ou privés) :
```js
// @errors: 7006 2554
class Todo {
done = $state(false);
text = $state();
constructor(text) {
this.text = text;
}
reset() {
this.text = '';
this.done = false;
}
}
```
Lorsque vous appelez des méthodes en JavaScript, la valeur de
[`this`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/this) a de
l'importance. L'exemple suivant ne fonctionne pas, car la référence `this` dans la méthode `reset`
est le `