Retour au blog

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 :

  1. La requête arrive
  2. Le serveur rend tout
  3. Envoie le HTML complet
  4. L'utilisateur voit le contenu

Avec Partial Pre-rendering :

  1. La requête arrive
  2. Le serveur envoie le shell pré-rendu immédiatement
  3. L'utilisateur voit la structure instantanément
  4. 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.0

Vé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

🚀 Accéder au Guide Complet

"Excellent matériel pour ceux qui veulent approfondir !" - Jean, Développeur

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires