Esc
 Naviguer  Ouvrir Esc Fermer
Aller au contenu

7.3 — Alternatives à React

🎯 Objectif : connaître les forces des alternatives à React pour faire un choix éclairé selon le projet, l’équipe et la cible technique.

À l'issue de cet axe, tu sauras :

  • Connaître Vue 3, Svelte 5, Solid, Qwik, Astro, Angular
  • Lire un composant écrit dans chaque framework
  • Choisir entre eux selon le contexte (équipe, perf, écosystème, courbe d'apprentissage)
  • Comprendre quand React n'est PAS le bon choix

Débutant 10 min prérequis : axe 6 lu

Pour rendre la comparaison concrète, voici un compteur simple dans chaque syntaxe.

import { useState } from 'react';
export function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Compté {count} fois
</button>
);
}
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
<button @click="count++">
Compté {{ count }} fois
</button>
</template>
<script>
let count = $state(0);
</script>
<button onclick={() => count++}>
Compté {count} fois
</button>
import { createSignal } from 'solid-js';
export function Counter() {
const [count, setCount] = createSignal(0);
return (
<button onClick={() => setCount(count() + 1)}>
Compté {count()} fois
</button>
);
}
---
import Counter from './Counter.tsx';
---
<h1>Page Astro</h1>
<Counter client:visible /> <!-- charge le JS uniquement quand visible -->
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-counter',
template: `<button (click)="count.set(count() + 1)">Compté {{ count() }} fois</button>`,
})
export class CounterComponent {
count = signal(0);
}
StyleTemplates HTML + <script setup>
RéactivitéRefs + Composition API (proxy)
Méta-frameworkNuxt 3
État globalPinia (officiel)
ForcesDocumentation excellente, courbe douce, syntaxe lisible
FaiblessesÉcosystème plus petit que React (mais solide)
  • Tu démarres une équipe avec des devs non frontend (Vue est plus intuitif côté HTML).
  • Tu veux moins de surprises que React (re-render moins agressif, réactivité explicite).
  • Tu préfères les single-file components (.vue qui contient template + script + style).
<script setup>
import { ref, computed, onMounted } from 'vue';
const items = ref([]);
const filter = ref('');
const filtered = computed(() => items.value.filter(i => i.name.includes(filter.value)));
onMounted(async () => {
items.value = await fetch('/api/items').then(r => r.json());
});
</script>
<template>
<input v-model="filter" placeholder="Filtrer…" />
<ul>
<li v-for="item in filtered" :key="item.id">{{ item.name }}</li>
</ul>
</template>

v-model fait du two-way binding : la variable et l’input se synchronisent automatiquement. C’est plus court qu’en React (value + onChange).

Depuis Vue 3.6, le Vapor Mode compile certains composants directement vers des opérations DOM sans passer par le Virtual DOM :

<script setup vapor>
// ce composant est compilé en code DOM direct
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
<button @click="count++">{{ count }}</button>
</template>

Bundle ~10 KB baseline (vs ~22 KB pour Vue 3 classique). ✅ Performances équivalentes à Svelte 5 sur les benchmarks. ✅ Opt-in par composant — tu peux mixer Vapor et VDOM dans la même app. ⚠ Encore expérimental — à valider sur ton cas d’usage avant prod.

C’est la réponse de Vue à la pression perf de Svelte/Solid : rendu brutal sans abandonner l’écosystème Vue.

StyleCompilation, pas de runtime de réactivité
RéactivitéRunes ($state, $derived, $effect)
Méta-frameworkSvelteKit
État globalStores natifs (writable) ou runes
ForcesBundle minuscule (~5 Ko), syntaxe limpide
FaiblessesÉcosystème encore plus petit que Vue, churn récent (Svelte 4 → 5 = changements significatifs)
  • Tu vises une app très performante (mobile, marchés émergents avec connexions lentes).
  • Tu veux moins de boilerplate qu’en React.
  • Tu démarres un projet où tu peux te permettre de t’éloigner du standard industriel.
<script>
let { name = 'Monde' } = $props(); // props
let count = $state(0);
let doubled = $derived(count * 2);
$effect(() => {
console.log('count a changé :', count);
});
</script>
<h1>Bonjour {name}</h1>
<button onclick={() => count++}>+</button>
<p>Compté : {count} (×2 = {doubled})</p>

C’est ultra lisible. Pas de hooks, pas de useEffect, pas de re-render mental — la variable change, ce qui dépend d’elle se met à jour. Point.

StyleJSX comme React, mais réactivité fine-grained
RéactivitéSignaux (comme Svelte 5, qui s’en est inspiré)
Méta-frameworkSolidStart
ForcesPerformances meilleures que React/Vue, syntaxe React-like
FaiblessesPetit écosystème, peu de talents disponibles

Quand tu connais déjà React mais veux les perfs de Svelte avec une syntaxe familière. Niche en 2026 mais solide techniquement.

StyleComposants JSX
ParticularitéResumability : la page est interactive sans hydratation, le JS se charge à la demande quand on interagit
ForcesTime-to-interactive instantané même sur grosses apps
FaiblessesTrès récent, écosystème naissant

Intéressant pour des applications gigantesques où le coût de l’hydratation classique est prohibitif. Niche, à surveiller.

StyleComposants .astro (HTML + frontmatter)
ParticularitéIslands architecture : par défaut, 0 JS envoyé. Seulement les composants déclarés interactifs sont hydratés
ForcesPerformance maximale pour les sites de contenu, intègre React/Vue/Svelte/Solid en îlots
FaiblessesPas pour les apps très dynamiques (SaaS, dashboards)
  • Sites de contenu : blogs, marketing, docs (comme ce site !), e-commerce léger.
  • Tu veux mixer plusieurs frameworks (un composant React ici, un Svelte là — Astro le permet).
  • Tu vises score Lighthouse > 95 par défaut.
---
// Frontmatter (TypeScript côté serveur, exécuté au build)
import ReactCounter from '../components/Counter.tsx';
import VueChart from '../components/Chart.vue';
const posts = await Astro.glob('../posts/*.md');
---
<html>
<body>
<h1>Mon blog</h1>
<ul>
{posts.map(p => <li><a href={p.url}>{p.frontmatter.title}</a></li>)}
</ul>
<!-- React, hydraté quand visible -->
<ReactCounter client:visible />
<!-- Vue, hydraté seulement sur interaction -->
<VueChart client:idle />
</body>
</html>
StyleComposants TypeScript-first, decorators
RéactivitéSignaux (depuis Angular 17) ou observables RxJS
Méta-frameworkInclus (routing, forms, DI, HttpClient — tout est officiel)
ForcesCohérence sur de très gros projets, opinions fortes, DI puissant
FaiblessesVerbeux, courbe abrupte, image plus “old school”
  • Grandes équipes (50+ devs) où la cohérence prime.
  • Contextes enterprise (banque, assurances) où Angular est encore le standard.
  • Tu viens de Java/C# et tu aimes l’architecture explicite.
Si…Choisis
Tu es sur le marché de l’emploi françaisReact (largement majoritaire)
Tu démarres seul / petite équipe et veux du funSvelte
Tu veux de la perf max pour un site de contenuAstro
Tu encadres une équipe non frontendVue
Tu rejoins une équipe enterprise avec gros projet existantAngular
Tu veux la perf de Svelte avec une syntaxe ReactSolid
Tu construis une app gigantesque où le JS bundle est un problèmeQwik
Tu construis un site marketing + blog (40 pages, peu d'interactivité). Choix idéal ?
Une équipe de 50+ devs sur une banque a un gros projet en TypeScript. Cohérence et discipline avant tout. Framework probable ?
Tu connais React. Tu veux essayer un framework avec moins de boilerplate et meilleures perfs. Que choisir d'abord ?

Suite : 7.4 — Méta-frameworks — Next.js, Nuxt, SvelteKit, Remix.