React 19.2 : Toutes les Nouveautés du Troisième Major Release de 2025
Salut HaWkers, React 19.2 est arrivé en octobre 2025, marquant la troisième sortie significative de l'année dernière après React 19 en décembre 2024 et React 19.1 en juin 2025.
Avez-vous déjà mis à jour vos projets ? Explorons les nouvelles features qui promettent de changer comment nous construisons des applications React.
Vue d'Ensemble de React 19.2
React 19.2 continue l'évolution de l'architecture async-first introduite dans React 19, apportant de nouvelles primitives pour le contrôle du rendu et la performance.
Principales Additions
- Activity component - Nouvelle primitive pour organiser les parties de l'application
- useEffectEvent - Hook pour les événements dans les effects
- cacheSignal - Contrôle de cache pour les Server Components
- Performance Tracks - Nouvel outil de profiling
- Partial Pre-rendering - Pré-rendu partiel de l'application
Activity Component
Activity est une nouvelle primitive qui permet de diviser votre application en "activités" qui peuvent être contrôlées et priorisées.
Concept de Base
import { Activity } from 'react';
function App() {
const [activeTab, setActiveTab] = useState('home');
return (
<div>
<TabBar activeTab={activeTab} onChange={setActiveTab} />
<Activity mode={activeTab === 'home' ? 'visible' : 'hidden'}>
<HomePage />
</Activity>
<Activity mode={activeTab === 'profile' ? 'visible' : 'hidden'}>
<ProfilePage />
</Activity>
<Activity mode={activeTab === 'settings' ? 'visible' : 'hidden'}>
<SettingsPage />
</Activity>
</div>
);
}Modes d'Activity
// visible - Rend et affiche normalement
<Activity mode="visible">
<Content />
</Activity>
// hidden - Maintient l'état mais cache du DOM
<Activity mode="hidden">
<Content />
</Activity>
// Transitions fluides entre états
function TabContent({ isActive, children }) {
return (
<Activity mode={isActive ? 'visible' : 'hidden'}>
{children}
</Activity>
);
}
Bénéfices d'Activity
1. Préservation de l'état :
Contrairement au rendu conditionnel, Activity préserve tout l'état du composant quand il est caché.
// Problème : État perdu au changement de tabs
function OldApproach({ activeTab }) {
return (
<>
{activeTab === 'form' && <FormWithState />} {/* État réinitialisé */}
</>
);
}
// Solution : Activity préserve l'état
function NewApproach({ activeTab }) {
return (
<Activity mode={activeTab === 'form' ? 'visible' : 'hidden'}>
<FormWithState /> {/* État maintenu */}
</Activity>
);
}2. Priorisation du rendu :
React peut prioriser les activités visibles sur celles cachées.
// Les activités visibles ont la priorité
<Activity mode="visible" priority="high">
<CriticalContent />
</Activity>
<Activity mode="hidden" priority="low">
<PreloadedContent />
</Activity>useEffectEvent
Le nouveau hook useEffectEvent résout un problème classique : utiliser des valeurs actuelles dans les effects sans causer de réexécution.
Le Problème
// Problème : L'effect se réexécute à chaque fois que onMessage change
function Chat({ onMessage }) {
useEffect(() => {
const connection = connect();
connection.on('message', (msg) => {
onMessage(msg); // onMessage est une nouvelle référence à chaque render
});
return () => connection.disconnect();
}, [onMessage]); // Se reconnecte à chaque render !
}La Solution
import { useEffectEvent } from 'react';
function Chat({ onMessage }) {
// Crée une référence stable au callback
const onMessageEvent = useEffectEvent(onMessage);
useEffect(() => {
const connection = connect();
connection.on('message', (msg) => {
onMessageEvent(msg); // Utilise toujours la version la plus récente
});
return () => connection.disconnect();
}, []); // Pas de dépendances, ne se reconnecte pas !
}
Cas d'Usage Pratiques
// Logging avec valeurs actuelles
function ProductPage({ productId, analytics }) {
const logVisit = useEffectEvent(() => {
analytics.logVisit(productId); // Utilise toujours productId actuel
});
useEffect(() => {
logVisit();
}, []);
return <Product id={productId} />;
}
// Timer avec callback mis à jour
function Timer({ onTick }) {
const handleTick = useEffectEvent(onTick);
useEffect(() => {
const id = setInterval(() => {
handleTick();
}, 1000);
return () => clearInterval(id);
}, []);
}cacheSignal
Le cacheSignal offre un contrôle fin sur le cache des Server Components.
Usage de Base
import { cacheSignal } from 'react';
async function ProductList() {
// Signal pour l'invalidation du cache
const signal = cacheSignal();
const products = await fetchProducts({ signal });
return (
<ul>
{products.map(p => (
<li key={p.id}>{p.name}</li>
))}
</ul>
);
}Invalidation Manuelle
// Server Action pour invalider le cache
'use server';
import { invalidateCache } from 'react';
export async function updateProduct(id, data) {
await db.products.update(id, data);
// Invalide le cache des composants utilisant ce signal
invalidateCache('products');
}Partial Pre-rendering
La feature la plus impactante de React 19.2 est le Partial Pre-rendering, qui permet de pré-rendre les parties statiques de l'application.
Comment Ça Fonctionne
// Layout statique pré-rendu
function Layout({ children }) {
return (
<html>
<head>
<title>Mon App</title>
</head>
<body>
<Header /> {/* Statique - pré-rendu */}
<Sidebar /> {/* Statique - pré-rendu */}
<Suspense fallback={<Loading />}>
{children} {/* Dynamique - rendu après */}
</Suspense>
<Footer /> {/* Statique - pré-rendu */}
</body>
</html>
);
}
Bénéfices de Performance
Flux traditionnel :
- La requête arrive
- Le serveur rend tout
- Envoie le HTML complet
- L'utilisateur voit le contenu
Avec Partial Pre-rendering :
- La requête arrive
- Le serveur envoie le shell pré-rendu immédiatement
- L'utilisateur voit la structure instantanément
- Le contenu dynamique charge progressivement
// Définir les parties statiques vs dynamiques
export default function Page() {
return (
<>
{/* Ces parties viennent du CDN instantanément */}
<Navigation />
<Hero />
{/* Cette partie est rendue à la demande */}
<Suspense fallback={<ProductSkeleton />}>
<ProductRecommendations />
</Suspense>
{/* Statique à nouveau */}
<Footer />
</>
);
}Performance Tracks
Nouvel outil pour le profiling détaillé de performance.
Intégration avec DevTools
import { startTrack, endTrack } from 'react';
function ExpensiveComponent() {
startTrack('ExpensiveComponent:render');
const result = expensiveCalculation();
endTrack('ExpensiveComponent:render');
return <div>{result}</div>;
}Visualisation dans React DevTools
Le Profiler montre maintenant :
- Temps de rendu par track
- Cascade de dépendances
- Impact des Server Components vs Client Components
- Métriques de cache hit/miss
Améliorations du React Compiler
Le React Compiler introduit dans React 19 a reçu des améliorations significatives.
Memoization Automatique Améliorée
// React Compiler optimise maintenant automatiquement
function ProductCard({ product, onAddToCart }) {
// Avant : Nécessitait useMemo/useCallback
// Maintenant : Le Compiler optimise automatiquement
const formattedPrice = formatCurrency(product.price);
const handleClick = () => onAddToCart(product.id);
return (
<div onClick={handleClick}>
<h3>{product.name}</h3>
<p>{formattedPrice}</p>
</div>
);
}
Migration vers React 19.2
Mise à Jour des Dépendances
npm install react@19.2.0 react-dom@19.2.0Vérification de Compatibilité
// Vérifier la version
import { version } from 'react';
console.log(version); // "19.2.0"
// Vérifier si Activity est disponible
const hasActivity = typeof Activity !== 'undefined';Activation des Nouvelles Features
// next.config.js (pour Next.js)
module.exports = {
experimental: {
ppr: true, // Partial Pre-rendering
reactCompiler: true,
},
};Comparaison des Versions
| Feature | React 19 | React 19.1 | React 19.2 |
|---|---|---|---|
| Server Components | Stable | Stable | Stable |
| Actions API | Nouveau | Amélioré | Amélioré |
| use() API | Nouveau | Stable | Stable |
| Compiler | Beta | Stable | Amélioré |
| Activity | - | - | Nouveau |
| useEffectEvent | - | - | Nouveau |
| Partial Pre-rendering | - | Expérimental | Stable |
Meilleures Pratiques
Quand Utiliser Activity
// BON : Tabs avec état complexe
<Activity mode={activeTab === 'editor' ? 'visible' : 'hidden'}>
<CodeEditor />
</Activity>
// BON : Modales qui préservent l'état
<Activity mode={isModalOpen ? 'visible' : 'hidden'}>
<Modal>
<ComplexForm />
</Modal>
</Activity>
// ÉVITER : Contenu simple sans état
// Utilisez le rendu conditionnel normal
{showContent && <SimpleContent />}Quand Utiliser useEffectEvent
// BON : Callbacks dans les effects de longue durée
const handleMessage = useEffectEvent(onMessage);
// BON : Analytics et logging
const logEvent = useEffectEvent((event) => analytics.log(event));
// ÉVITER : Remplacer useCallback pour les handlers d'événements normaux
// useCallback est toujours approprié pour les props de composants
Conclusion
React 19.2 continue l'évolution de React vers une architecture plus efficace et flexible. Activity et useEffectEvent résolvent des problèmes réels de développement, tandis que Partial Pre-rendering offre des gains significatifs de performance.
La recommandation est de commencer à expérimenter ces features sur de nouveaux projets ou des parties isolées de projets existants avant une migration complète.
Si vous voulez approfondir vos connaissances en React et JavaScript moderne, je recommande de jeter un œil à un autre article : ECMAScript 2025 : Toutes les Nouvelles Features où vous découvrirez les nouveautés JavaScript qui complètent React 19.2.
C'est parti ! 🦅
🎯 Rejoignez les Développeurs Qui Évoluent
Des milliers de développeurs utilisent déjà notre matériel pour accélérer leurs études et conquérir de meilleures positions sur le marché.
Pourquoi investir dans des connaissances structurées ?
Apprendre de manière organisée et avec des exemples pratiques fait toute la différence dans votre parcours de développeur.
Commencez maintenant :
- 1x de 9,90€ par carte
- ou 9,90€ comptant
"Excellent matériel pour ceux qui veulent approfondir !" - Jean, Développeur

