Hot Reload est une technologie où les modifications du code source sont appliquées à une application en cours d'exécution sans rechargement complet de la page et sans perte de l'état actuel. Contrairement à Live Reload, qui actualise simplement la page entière, le rechargement à chaud ne remplace que les modules modifiés à la volée. Selon Webpack, 2024, le Hot Module Replacement (HMR) réduit le temps du cycle de développement jusqu'à 80 % en préservant l'état des composants.
Points clés
Hot Reload est un mécanisme de développement où les modifications apportées aux fichiers source sont immédiatement reflétées dans une application en cours d'exécution sans la redémarrer. Le développeur modifie le code dans l'éditeur, enregistre le fichier, et le résultat est instantanément visible dans le navigateur ou l'émulateur.
La caractéristique clé de cette technologie est la préservation de l'état de l'application. Les variables en mémoire, les données dans les formulaires, la navigation actuelle — tout reste en place. Le développeur n'a pas besoin de répéter une séquence d'actions pour revenir à l'écran souhaité.
Dans le développement web, Hot Reload est implémenté via le mécanisme Hot Module Replacement (HMR). Le bundler surveille les modifications des fichiers, détermine quels modules sont affectés et envoie le code mis à jour au navigateur via WebSocket. Le navigateur ne remplace que ces modules sans recharger la page.
La popularité de Hot Reload a grimpé avec l'essor des applications monopages (SPA), où un rechargement complet de la page détruit tout l'état de l'application cliente. React, Vue, Angular et d'autres frameworks recommandent le HMR comme mode de développement principal.
Le mécanisme HMR se compose de quatre étapes. Le bundler côté serveur compile le module modifié, génère un correctif JSON avec la nouvelle version du code et l'envoie au navigateur via une connexion WebSocket. L'environnement d'exécution HMR côté navigateur reçoit le correctif, remplace l'ancien module par le nouveau et notifie les abonnés du module.
Webpack Dev Server utilise WebSocket pour communiquer avec le client. Lorsqu'un fichier change, le bundler génère hot-update.js et hot-update.json avec un manifeste des modifications. Le client charge automatiquement ces fichiers via JSONP.
// webpack.config.js - configuration HMR
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
liveReload: false
},
plugins: [new HtmlWebpackPlugin()]
};
L'environnement d'exécution HMR dans le navigateur vérifie si le module remplacé prend en charge accept. Si le module a déclaré module.hot.accept(), l'environnement le remplace sur place et exécute le rappel de mise à jour. Si accept n'est pas déclaré, HMR remonte au niveau du module parent.
Dans React Fast Refresh, cette logique est intégrée au niveau du framework — il n'est pas nécessaire d'écrire manuellement module.hot.accept dans chaque fichier. Le plugin Babel react-refresh/babel ajoute du code qui remplace les composants en toute sécurité sans perdre l'état.
Ces trois termes sont souvent confondus, mais ils diffèrent radicalement par leur comportement. Live Reload recharge la page entière à chaque modification — tout l'état est perdu. Full Reload se produit lorsque le serveur de développement est complètement redémarré, perdant non seulement l'état du client mais aussi celui du serveur.
| Type | Rechargement page | Préservation état | Vitesse |
|---|---|---|---|
| Hot Reload (HMR) | Non | Oui | Instantané |
| Live Reload | Oui | Non | 1-3 s |
| Full Reload | Oui | Non | 3-10 s |
Le choix entre Hot et Live affecte directement la vitesse de développement. Avec HMR, le cycle « modifier le code → voir le résultat » prend 50 à 200 ms. Avec Live Reload — 1 à 3 secondes plus le temps de restauration du contexte. Sur une journée de travail, la différence représente des dizaines de minutes de temps économisé.
React Fast Refresh est l'implémentation officielle de Hot Reload optimisée pour les composants React. Elle a remplacé l'ancien mécanisme React Hot Loader, qui était instable et nécessitait une configuration manuelle. Fast Refresh est intégré à Create React App, Next.js, Vite et Webpack via react-refresh/babel.
Fast Refresh préserve correctement l'état des composants fonctionnels lorsque leur code change. Si vous modifiez uniquement le balisage JSX, useState et les autres hooks conservent leurs valeurs. Si la logique du hook change, le composant est remonté.
// Exemple - état préservé lorsque JSX change
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
Fast Refresh ne préserve pas l'état si le nouveau code contient une erreur de compilation. Si le composant n'est pas exporté par défaut (named export), l'état peut également ne pas être préservé. Il est recommandé d'utiliser export default pour les composants et d'envelopper les exportations dans memo si la préservation de l'état doit être garantie.
Les bundlers modernes fournissent le HMR. Webpack est le pionnier du HMR avec une configuration flexible via devServer.hot. Vite utilise l'ESM natif et esbuild pour un HMR instantané sans bundling. Parcel offre un HMR zéro configuration. Turbopack est un nouveau bundler de Vercel avec HMR basé sur Rust.
| Outil | Type de HMR | Configuration | Écosystème |
|---|---|---|---|
| Webpack 5 | HMR via WebSocket | devServer.hot: true | React, Vue, Angular |
| Vite | HMR ESM natif | Intégré | React, Vue, Svelte |
| Parcel 2 | HMR zéro config | Non requis | React, Vue, TS |
| Turbopack | HMR incrémental | Intégré | Next.js |
Vite se distingue par sa vitesse — le HMR dans Vite fonctionne via les modules ES natifs du navigateur. Lorsqu'un fichier change, Vite n'envoie que ce module via import(), sans recompiler l'ensemble du projet. Webpack compile chaque module entièrement, ce qui ralentit le HMR dans les grands projets.
Voyons la configuration du HMR pour différents bundlers. Dans Webpack, il faut définir hot: true dans devServer et ajouter react-refresh/babel. Dans Vite, le HMR fonctionne intégré avec n'importe quel préréglage. Dans Next.js, Fast Refresh est activé par défaut via le turbocompilateur.
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
server: {
hmr: {
port: 3001
}
}
});
// webpack.config.js
const ReactRefreshWebpackPlugin =
require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
mode: 'development',
devServer: { hot: true },
plugins: [new ReactRefreshWebpackPlugin()],
module: {
rules: [
{
test: /\.jsx?$/u,
use: 'babel-loader'
}
]
}
};
Le HMR ne fonctionne pas correctement dans tous les scénarios. Les modules CSS avec des classes dynamiques peuvent ne pas s'appliquer. Les variables globales et les singletons (store Redux, routeur) peuvent se réinitialiser au rechargement. Les bibliothèques lourdes avec HMR peuvent parfois générer des fuites mémoire en raison du remplacement de modules sans GC.
La solution aux problèmes de HMR consiste à isoler le code chaud dans des composants purs sans effets secondaires. Les effets secondaires (abonnements WebSocket, minuteries) doivent être nettoyés dans useEffect. Pour Redux, un persister qui sauvegarde l'état dans sessionStorage est recommandé. Les solutions CSS comme CSS Modules ou styled-components fonctionnent correctement avec HMR sans configuration supplémentaire.
Une autre limitation est le débogage en production : le HMR est intentionnellement désactivé dans les builds de production. Le code source est minifié et le remplacement à chaud en production est impossible. Pour déboguer les erreurs en production, utilisez les source maps et la journalisation, mais pas le HMR.
Foire aux questions
Hot Reload remplace uniquement le module modifié sans recharger la page et préserve l'état. Live Reload recharge la page entière — l'état est perdu, l'application redémarre depuis l'écran initial.
Dans les projets utilisant Create React App et Vite, le HMR est activé par défaut. Dans Webpack, il faut ajouter devServer: { hot: true } et @pmmmwh/react-refresh-webpack-plugin. Dans Next.js, Fast Refresh fonctionne sans configuration.
La cause est une erreur de compilation dans le nouveau code, un named export au lieu de default, un changement de signature du hook ou une mutation directe de l'état. React Fast Refresh réinitialise le composant en toute sécurité uniquement lorsque cela est nécessaire pour un fonctionnement correct.
Oui, tous les bundlers modernes prennent en charge HMR avec TypeScript. Vite utilise esbuild pour la transpilation TS. Webpack utilise ts-loader ou babel avec @babel/preset-typescript. Fast Refresh fonctionne correctement avec les composants typés.
Vérifiez la console du navigateur pour les erreurs de connexion WebSocket. Assurez-vous que devServer.hot: true est activé. Pour Vite, vérifiez le port HMR. Si le problème persiste, effectuez un rechargement complet de la page (F5) et vérifiez la console du bundler.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi