Rechargement à chaud de modules (HMR)

Comment le Hot Module Replacement (HMR) remplace des modules a l'execution sans rechargement complet : fonctionnement, bundlers et bonnes pratiques.

Qu'est-ce que le Hot Module Replacement (HMR) ?

Le Hot Module Replacement (HMR) est une fonction du serveur de developpement qui remplace, ajoute ou supprime des modules JavaScript et CSS dans une application en cours d'execution, sans recharger entierement la page. Quand vous enregistrez un fichier, seuls le module modifie et ses dependants directs sont reevalues puis injectes dans la page active, tandis que le reste de l'application continue de tourner. Le resultat est un retour presque instantane, et l'etat de l'application (fenetres ouvertes, saisies de formulaire, position du routeur, donnees en memoire) est generalement preserve.

Le HMR est un concept de la phase de build et de developpement, et il n'arrive pas en production. Il rend la boucle interne de developpement plus rapide et moins perturbante. Comme il preserve l'etat et evite le clignotement d'un rechargement complet, il maintient la concentration. Cette boucle courte agit aussi sur la performance web : quand tester un changement de mise en page coute peu, vous experimentez davantage et reperez les regressions plus tot.

Pourquoi le HMR existe : rechargement complet, live reload et HMR

Auparavant, un rechargement complet a chaque enregistrement etait la norme. Un rechargement complet jette toute la page, retelecharge et reanalyse chaque ressource, reexecute le code de demarrage et reinitialise tout l'etat. Sur une grande application monopage, cela peut prendre plusieurs secondes, et tout etat prepare pour reproduire un bug est perdu.

Le live reload recharge automatiquement l'onglet lors d'un changement, mais reste au fond un rechargement complet, donc l'etat est perdu. Le HMR va plus loin et ne corrige que les modules modifies. Un changement de CSS met a jour les styles sans aucun rechargement ; un changement de composant ne re-rend que ce composant et son sous-arbre. C'est pourquoi le HMR semble different du live reload, pas seulement plus rapide.

Comment fonctionne le HMR

Le HMR repose sur plusieurs elements que le bundler et le serveur de developpement relient pour vous.

Le runtime HMR

Lors d'un build de developpement, le bundler injecte un petit runtime HMR dans la page. Ce runtime connait les modules de l'application et sait remplacer un module donne en memoire a l'execution.

Le canal de mise a jour

Le serveur de developpement surveille vos fichiers source. Lors d'un changement, il recompile le module concerne et envoie une notification au navigateur, generalement via une connexion websocket. Le runtime recupere alors le nouveau code et l'applique.

Frontieres de module et l'API accept et dispose

Le HMR doit savoir jusqu'ou une mise a jour doit se propager. Chaque module peut declarer qu'il accepte une nouvelle version via une API HMR, exposee habituellement comme import.meta.hot (Vite) ou module.hot (Webpack). Un module appelle accept et peut enregistrer un gestionnaire dispose pour nettoyer les effets de bord (minuteurs, ecouteurs, abonnements) avant que l'ancienne version soit ecartee. Si un module modifie n'accepte pas la mise a jour, le runtime remonte le graphe de dependances a la recherche d'un ancetre qui l'accepte. S'il atteint le point d'entree sans en trouver, le HMR se rabat sur un rechargement complet.

Quels bundlers et frameworks prennent en charge le HMR

  • Webpack a popularise le HMR et l'expose via l'API module.hot.
  • Vite offre un HMR tres rapide fonde sur les modules ES natifs et l'API import.meta.hot.
  • Parcel propose le HMR sans configuration pour la plupart des projets.
  • Les montages fondes sur esbuild et Rollup ajoutent le HMR via des plugins ou des serveurs de developpement.

Les frameworks ajoutent un HMR conscient de l'etat. React Fast Refresh re-rend les composants edites en conservant si possible leur etat de hooks. Vue, Svelte, Angular et SolidJS apportent leur propre gestion du HMR.

Preservation de l'etat

Le principal avantage du HMR est de conserver l'etat malgre une edition. Si vous etes au milieu d'un tunnel d'achat et que vous ajustez le style du formulaire, le HMR le met a jour sur place et vous restez a cette etape. Les integrations de framework l'etendent a l'etat du composant : React Fast Refresh tente de conserver les valeurs de useState et useRef tant que la signature reste compatible. Cette preservation est au mieux, pas une garantie : editer un fichier avec un etat au niveau du module ou changer la forme exportee peut forcer une reinitialisation.

Le HMR compare

AspectHMRLive reloadRechargement complet
Etat preserveLe plus souventNonNon
Portee de la mise a jourModule modifie et dependantsPage entierePage entiere
VitesseLa plus rapideMoyenneLa plus lente
Effort de configurationInclus dans l'outillage moderneMinimalAucun

Limites et pieges frequents

  • Les modules qui n'acceptent pas forcent un rechargement et l'etat est perdu malgre tout.
  • Les effets de bord demandent dispose. Les minuteurs, connexions ou ecouteurs globaux doivent etre nettoyes dans un gestionnaire dispose, sinon chaque edition laisse fuir une instance de plus.
  • L'etat au niveau du module est fragile et peut se reinitialiser lors d'une mise a jour.
  • Le HMR est reserve au developpement. Il ne reflete jamais la performance de production.

Bonnes pratiques pour un HMR fiable

  • Gardez des modules cibles et sans effets de bord a l'import pour que les frontieres de mise a jour restent nettes.
  • Enregistrez des gestionnaires dispose pour tout ce qui est durable : intervalles, sockets, observers et ecouteurs.
  • Appuyez-vous sur des integrations comme React Fast Refresh plutot que d'ecrire la logique accept a la main.
  • Evaluez la performance reelle separement de la boucle de developpement. Les jugements sur le temps de chargement et la stabilite relevent de builds proches de la production et de tests de charge, pas du serveur de developpement avec HMR.

Depannage du HMR

Quand le HMR se comporte mal, avancez avec methode. Si une edition ne fait rien, verifiez que le serveur de developpement tourne et que le canal de mise a jour websocket est connecte. Si chaque edition declenche un rechargement complet, un module du chemin modifie n'accepte pas les mises a jour, donc verifiez les effets de bord a l'import. Si un ancien comportement persiste, suspectez un gestionnaire dispose manquant et redemarrez le serveur de developpement pour repartir sur une base propre.

FAQ sur le Hot Module Replacement

Le HMR est-il la meme chose que le live reload ?

Non. Le live reload recharge toute la page et perd l'etat, tandis que le HMR ne remplace que les modules modifies et preserve generalement l'etat. Le HMR ne se rabat sur un rechargement complet que lorsqu'il ne peut pas corriger un changement en toute securite.

Le HMR s'execute-t-il en production ?

Non. Le HMR est une fonction reservee au serveur de developpement et a l'outillage de build. Les bundles de production n'incluent pas le runtime HMR.

Pourquoi mon application fait-elle parfois un rechargement complet avec le HMR active ?

Cela arrive quand un module modifie, ou l'un de ses ancetres, n'accepte pas la mise a jour. Le runtime remonte le graphe de dependances et, s'il ne trouve pas de frontiere acceptante avant le point d'entree, il recharge toute la page.

Quels outils prennent en charge le HMR nativement ?

Vite, Webpack et Parcel offrent le HMR, et les frameworks ajoutent des couches conscientes de l'etat comme React Fast Refresh et le HMR des composants monofichier de Vue. La plupart des montages modernes activent le HMR en developpement automatiquement.

Le HMR preserve-t-il l'etat des composants ?

Souvent oui, grace a des integrations comme React Fast Refresh qui tente de conserver l'etat local entre les editions. La preservation est au mieux, donc changer la forme d'un composant peut le reinitialiser.

Puis-je me fier aux temps du HMR pour juger la performance ?

Non. Le HMR reflete l'experience de developpement, pas la performance de production. Mesurez le temps de chargement reel, le rendu et la stabilite avec des builds proches de la production et des tests de charge dedies.

Quelle est la vitesse de votre site web?

Augmentez sa vitesse et son référencement naturel de manière transparente avec notre Test de Vitesse gratuit.

Test gratuit de vitesse du site Web

Analyser la vitesse de chargement de votre site Web et améliorer ses performances avec notre outil gratuit de vérification de la vitesse de la page.

×