Marre de React ? Svelte 5 : moitié moins de code, double performance (tutoriel complet)

Pourquoi j’apprends encore un nouveau framework
En ouvrant la doc Svelte, j’étais sceptique. Tous les quelques ans un framework promet « cette fois c’est différent », souvent pour peu de changement. Mon projet React tournait bien — pourquoi s’embêter ?
Puis le premier exemple m’a figé. Compteur : React exige useState, setCount, et l’interdiction de muter le state directement. Svelte ? let count = $state(0), puis count++. C’est tout.
Cette simplicité m’a accroché trois heures de tutoriel d’affilée — pas par complexité, mais par clarté. Si vous avez la « fatigue des frameworks », cet article parle de la logique « optimisation à la compilation » de Svelte 5 — elle a changé ma façon de voir le frontend.
Qu’est-ce que Svelte ? L’essence d’un framework à la compilation
Une image pour compiler vs runtime :
React, c’est la livraison de repas : chaque livraison emporte couverts, serviettes, emballages — Virtual DOM, reconciliation — que vous les utilisiez ou non. Résultat : ~42 Ko de base React pour un « Hello World ».
Svelte, c’est la cuisine maison : ingrédients prêts (votre code), cuisson (compilation), assiette de pur JS (~1,6 Ko), sans surcharge.
J’ai mesuré la même app Todo en React et Svelte :
En 3G (beaucoup d’utilisateurs y sont encore), 300 ms peuvent signifier 5 à 10 % de rebond en plus sur e-commerce ou média.
Svelte 5 vs 4 ? Runes — nouvelle API réactive, bundle −15 à 30 %, code plus lisible.
Ne réécrivez pas React tout de suite. Ce ne sont pas des substituts mais des philosophies : React, écosystème et flexibilité ; Svelte, perf et simplicité. Le choix dépend du contexte.
Runes en profondeur : la magie du compilateur
Le cœur de Svelte 5, ce sont les Runes — nom un peu fantaisiste, usage très concret.
$state : enfin sans setter
React :
// React : setter à chaque fois
const [count, setCount] = useState(0)
function increment() {
setCount(count + 1) // attention aux pièges de closure
}
Svelte 5 :
// Svelte 5 : comme du JS natif
let count = $state(0)
function increment() {
count++ // le compilateur gère la réactivité
}
Au début je cherchais le setter — inutile. Le compilateur insère traçage et mises à jour. En projet : 30 à 40 % de code en moins, surtout sur les formulaires sans handleXXXChange.
$derived : dépendances automatiques
Avec useMemo, le tableau de dépendances est un cauchemar : oubli → pas de mise à jour ; trop de deps → recalculs incessants.
Svelte :
// React : dépendances manuelles
const doubled = useMemo(() => count * 2, [count])
const quadrupled = useMemo(() => doubled * 2, [doubled])
// Svelte 5 : traçage automatique
let doubled = $derived(count * 2)
let quadrupled = $derived(doubled * 2)
Sur un devis multi-champs, React avait deux lignes de deps à surveiller ; Svelte, le compilateur s’en charge. Vous écrivez la logique, la réactivité suit.
$effect : effets de bord sans friction
useEffect est l’un des Hooks les plus déroutants : deps, cleanup, timing…
Svelte :
// React : cleanup manuel
useEffect(() => {
const subscription = someAPI.subscribe()
return () => {
subscription.unsubscribe()
}
}, [/* deps */])
// Svelte 5 : nettoyage automatique
$effect(() => {
const subscription = someAPI.subscribe()
// démontage géré par le compilateur
})
Polling, WebSocket, localStorage : fluide, sans crainte de fuite mémoire.
$props : props typées
// React
function TodoItem({ todo, onToggle }) {
// PropTypes ou TS à la main
}
// Svelte 5
<script>
let { todo, onToggle } = $props()
// TypeScript intégré
</script>
Peu de différence en apparence, mais plus naturel à l’usage ; TS officiel sans config extra.
Svelte vs React/Vue : un choix, pas une guerre
Faut-il migrer ? Les outils ne font pas le projet — j’ai vu du jQuery élégant et du React brouillon.
Courbe d’apprentissage
Svelte : HTML + CSS + JS. Junior formé : tutoriel officiel, composants seuls en deux jours.
React : JSX, Hooks, immuabilité, reconciliation — 1 à 2 semaines pour bien comprendre. La profondeur se lit dans la masse d’articles « astuces React ».
Vue : entre les deux ; templates clairs, mais directives, computed, watch…
Performance
Soyons honnêtes : sur un petit Todo, l’écart se sent peu.
Là où ça compte :
- Grosses listes : catalogue e-commerce, chat. 10 000 lignes : Svelte ~58 FPS, React ~45 FPS.
- Updates fréquents : dashboards, bourse — pas de diff Virtual DOM lourd.
- Mobile en 3G : petit bundle = avantage net.
Source : benchmarks JS 2025, environnements standardisés — mesurez sur votre projet.
Écosystème : mature vs compact
Svelte reste en retrait face à React :
- npm/semaine : Svelte ~500 k vs React ~20 M
- Stack Overflow : Svelte ~12 k vs React ~500 k
- Bibliothèques UI : dizaines vs centaines
Mais la communauté est active — Rich Harris répond parfois sur Discord, rare côté React. Toolchain moderne : Vite, SvelteKit, TypeScript natif, sans montagne de loaders Webpack.
Quand choisir Svelte ?
| Scénario | Framework | Raison |
|---|---|---|
| Grande entreprise | React | Écosystème, recrutement |
| Perf critique | Svelte | Petit bundle, rapidité |
| Prototype rapide | Svelte | Peu de code, prise en main |
| Refactoring existant | Stack actuelle | Coût de migration |
| Side project | Svelte | Exploration |
Équipe déjà sur React : ne changez pas sans forte douleur perf. Nouveau projet, petite équipe ou curiosité : Svelte vaut le coup.
Tutoriel 30 min : Todo avec Svelte 5
Assez de théorie — construisons une app Todo pour sentir Runes.
Structure
svelte-todo/
├── src/
│ ├── lib/
│ │ └── TodoItem.svelte // composant Todo
│ ├── App.svelte // app principale
│ └── main.js // entrée
└── package.json
App.svelte
<script>
// Runes : concis et puissant
let todos = $state([])
let input = $state('')
// $derived suit todos sans deps manuelles
let remaining = $derived(
todos.filter(t => !t.done).length
)
function addTodo() {
if (input.trim()) {
todos.push({
id: Date.now(),
text: input,
done: false
})
input = ''
}
}
function toggleTodo(id) {
const todo = todos.find(t => t.id === id)
if (todo) {
todo.done = !todo.done
}
}
function deleteTodo(id) {
todos = todos.filter(t => t.id !== id)
}
</script>
<div class="app">
<h1>Mes tâches</h1>
<div class="input-area">
<input
bind:value={input}
placeholder="Ajouter une tâche..."
onkeydown={(e) => e.key === 'Enter' && addTodo()}
/>
<button onclick={addTodo}>Ajouter</button>
</div>
<p class="stats">
Il reste {remaining} tâche(s) à terminer
</p>
<ul class="todo-list">
{#each todos as todo}
<TodoItem
{todo}
onToggle={() => toggleTodo(todo.id)}
onDelete={() => deleteTodo(todo.id)}
/>
{/each}
</ul>
</div>
<style>
.app {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.input-area {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
padding: 10px 20px;
background: #0066cc;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.stats {
color: #666;
margin-bottom: 10px;
}
.todo-list {
list-style: none;
padding: 0;
}
</style>
TodoItem.svelte
<script>
let { todo, onToggle, onDelete } = $props()
</script>
<li class="todo-item">
<label>
<input
type="checkbox"
checked={todo.done}
onchange={onToggle}
/>
<span class:done={todo.done}>
{todo.text}
</span>
</label>
<button class="delete-btn" onclick={onDelete}>
Supprimer
</button>
</li>
<style>
.todo-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border-bottom: 1px solid #eee;
}
label {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.done {
text-decoration: line-through;
color: #999;
}
.delete-btn {
padding: 5px 10px;
background: #ff4444;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
}
</style>
Lancer
npm create vite@latest svelte-todo -- --template svelte
cd svelte-todo
npm install
npm run dev
Ouvrez http://localhost:5173 — Todo fonctionnelle.
Points clés
- Réactivité naturelle : pas de
setStatenidispatch. - Sans lib de state : pas de Redux/Context pour un projet moyen.
- Styles isolés : CSS scoped par composant.
- Build minuscule :
npm run build→ ~5 Ko.
Piège Svelte 4 : après todos.push(), réassignation obligatoire. Svelte 5 : push suffit — différence importante.
La simplicité n’excuse pas une mauvaise architecture sur gros projet ; en Svelte, concentrez-vous sur le métier, pas sur le paradigme de state.
Écosystème, communauté, avenir
État des lieux
Malgré l’écart avec React, l’essentiel est là :
- SvelteKit : full-stack officiel (SSR, SSG, routes API) — rôle proche de Next.js.
- UI : Svelte Material UI, Carbon Components, Skeleton UI…
- Toolchain : Vite, Prettier, ESLint.
- Cas réels : Spotify, Square, NYT, projets internes Apple.
Communauté plus petite, très active — Harris et l’équipe core sur Discord.
Ressources
- Tutoriel officiel : interactif, ~80 % des concepts en une passe.
- Discord Svelte : réponses rapides et de qualité.
- Exemples GitHub : dépôt officiel riche.
- Contenus FR : articles sur Medium, dev.to et blogs francophones.
Tendances
Mon avis : Svelte ne sera pas le mainstream, mais reste un choix sérieux.
Le fossé React est profond en entreprise. Svelte brille en perf (UI de jeu, dashboards, mobile), petites équipes (startup, outils internes) et formation (syntaxe proche du Web).
Svelte 5 est prêt pour la prod ; TypeScript progresse. Apprendre Svelte n’enrichit pas toujours le CV, mais élargit la réflexion — revenu sur React, vous optimiserez autrement.
Conclusion : un week-end pour essayer
Svelte mérite un week-end d’exploration.
Pas de réécriture massive — plutôt :
- 2 h de tutoriel officiel cette semaine.
- Refaire un petit projet (calculatrice, météo…) en Svelte.
- Ne pas imposer à l’équipe avant d’avoir validé le fit.
Chaque framework se dit « révolutionnaire » ; ce qui compte, ce sont les idées : compilation, API simples, perf. Applicables partout.
La technique sert le produit. React et Svelte résolvent souvent les mêmes problèmes — choisissez selon équipe, contexte, intuition.
Perf, lassitude du boilerplate, ou simple curiosité : ouvrez https://svelte.dev/tutorial.
Deux heures, le prix d’un repas — et peut-être l’outil qu’il vous fallait.
Construire une app Todo avec Svelte 5 de zéro
App Todo pratique pour apprendre Runes : $state, $derived, $effect et APIs clés
Estimated time: PT30M
-
1
Step 1: Créer le projet Svelte et installer les dépendances
Projet Vite : -
2
Step 2: Implémenter la logique App.svelte
État réactif $state : -
3
Step 3: Composant TodoItem
Props : -
4
Step 4: Svelte 5
todos.push() suffit (vs Svelte 4). -
5
Step 5: Comprendre les avantages Runes
$state : pas de setter, count++, −30 à 40 % de code -
6
Step 6: $derived
deps auto, formulaires complexes -
7
Step 7: $effect
cleanup auto, polling, WebSocket, localStorage -
8
Step 8: $props
déstructuration, TS natif -
9
Step 9: Build et tests perf
Production : -
10
Step 10: 3G
Svelte ~800 ms interactif, React ~1100 ms -
11
Step 11: 10 000 lignes
Svelte ~58 FPS, React ~45 FPS
FAQ
Quel écart de performance entre Svelte 5 et React ? Quelles données concrètes ?
• Même app Todo en React et Svelte
• React 145 Ko (avec Tree Shaking), Svelte 5,2 Ko (96 % de moins)
Premier chargement :
• En 3G, Svelte interactif en 800 ms, React en 1100 ms
• 300 ms d'écart peuvent signifier 5 à 10 % de rebond en plus sur une page e-commerce ou média
Rendu massif :
• Sur 10 000 lignes, Svelte tient 58 FPS, React 45 FPS
Svelte 5 vs Svelte 4 : bundle 15 à 30 % plus petit, code plus lisible.
À noter : sur un petit projet Todo, l'écart se sent peu. Il devient net sur grosses listes, mises à jour fréquentes et mobile en réseau faible.
Qu'est-ce que le système Runes de Svelte 5 ? Différences entre $state, $derived et $effect ?
$state :
• État réactif sans setter : let count = $state(0), puis count++
• Le compilateur gère la réactivité ; 30 à 40 % de code en moins en pratique
• Fini les handleXXXChange sur les formulaires
$derived :
• Valeurs dérivées, dépendances tracées automatiquement : let doubled = $derived(count * 2)
• Idéal pour des calculs de formulaire complexes
$effect :
• Effets de bord, nettoyage automatique par le compilateur
• Exemple : $effect(() => { const subscription = someAPI.subscribe() })
• Pas de fuite mémoire — polling API, WebSocket, sync localStorage
$props :
• Props par déstructuration : let { todo, onToggle } = $props()
• TypeScript intégré
Courbe d'apprentissage Svelte vs React : que choisir en débutant ?
• HTML + CSS + JS, proche du Web standard
• J'ai formé un junior : tutoriel officiel, composants autonomes en deux jours
React :
• JSX, règles des Hooks, immuabilité, reconciliation
• Compréhension solide : 1 à 2 semaines intensives
• La profondeur se voit dans les articles « X astuces React que vous ignorez »
Vue :
• Entre les deux ; templates plus intuitifs que JSX, mais directives, computed, watch…
Pour débuter, Svelte est plus accessible. React offre un écosystème et des offres d'emploi plus larges — le choix dépend de l'objectif.
Prototype rapide ou perf : Svelte. Grandes entreprises : React.
Quel écosystème pour Svelte comparé à React ?
• npm : Svelte ~500 k téléchargements/semaine (React ~20 M)
• Stack Overflow : Svelte ~12 k questions (React ~500 k)
• Bibliothèques UI : dizaines pour Svelte, centaines pour React
Contreparties :
• Communauté petite mais active ; Rich Harris (auteur) répond parfois sur Discord
• Rare dans l'écosystème React
Toolchain moderne :
• Vite natif, SvelteKit full-stack, TypeScript intégré
• Pas de pile de loaders Webpack comme souvent avec React
Adoptions réelles :
• Outils internes Spotify, back-office Square, graphiques interactifs NYT, projets internes Apple
L'essentiel existe :
• SvelteKit (équivalent Next.js)
• UI : Svelte Material UI, Carbon Components, Skeleton UI…
• Vite, Prettier, ESLint
Beaucoup de composants tiers → React. Perf et simplicité → Svelte.
Quand choisir Svelte plutôt que React ?
1) Perf critique (UI de jeu, dashboards temps réel, mobile)
2) Prototype rapide
3) Side project / exploration
4) Petite équipe (startup, outils internes)
React :
1) Grande entreprise, écosystème et recrutement
2) Refactoring existant — coût de migration élevé
3) Besoin massif de bibliothèques tierces
Matrice :
• Équipe déjà sur React : ne changez pas sans douleur perf forte
• Nouveau projet, petite équipe ou envie d'essayer : Svelte est un bon pari
Mon avis :
• Svelte ne deviendra pas le standard, mais reste un choix important
• Le fossé écosystème de React est profond
• Svelte a sa place en perf, petites équipes et formation
Svelte 5 vs Svelte 4 : quoi changer à la migration ?
Bundle :
• 15 à 30 % plus petit qu'en Svelte 4, code plus lisible
Différence clé :
• Svelte 4 : après todos.push(), réassignation nécessaire (todos = [...todos, newTodo])
• Svelte 5 : push direct (todos.push(newTodo))
API :
• Svelte 4 : $: doubled = count * 2
• Svelte 5 : let doubled = $derived(count * 2)
Stabilité :
• Svelte 5 validé en production, TypeScript en progression
Migration :
• Nouveau projet → Svelte 5 directement
• Svelte 4 existant → migration progressive, coexistence possible
Ressources :
• Tutoriel interactif officiel
• Discord Svelte, réponses de qualité
8 min de lecture · Publié le: 24 nov. 2025 · Mis à jour le: 27 juil. 2026
Framework frontend
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
J'ai reconstruit mon blog avec Astro 5 : score Lighthouse de 68 à 100
Retour d'expérience réel sur la migration de Next.js vers Astro 5. Island Architecture, Content Layer, configuration SEO et checklist d'optimisation reproductible. Temps de build de 2 min à 18 s, score Lighthouse de 68 à 98.
Partie 2 sur 6
Suivant
Formulaire React 19 en 30 lignes ? Actions en un clin d'œil, perf +40 %
Analyse approfondie des 6 fonctionnalités clés de React 19 : Actions, use(), Compiler, etc. Comparaisons code avant/après pour simplifier les formulaires, optimiser les performances et maîtriser les Server Components. Retour d'une semaine de pratique pour monter en compétence rapidement.
Partie 4 sur 6



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire