Hot-Modul-Austausch (HMR)
So tauscht Hot Module Replacement (HMR) Module zur Laufzeit ohne vollstaendigen Reload aus: Funktionsweise, unterstuetzte Bundler und Best Practices.
Was ist Hot Module Replacement (HMR)?
Hot Module Replacement (HMR) ist eine Funktion des Entwicklungsservers, die JavaScript- und CSS-Module in einer laufenden Anwendung austauscht, hinzufuegt oder entfernt, ohne die Seite vollstaendig neu zu laden. Beim Speichern einer Datei werden nur das geaenderte Modul und seine direkten Abhaengigen neu ausgewertet und in die aktive Seite eingespielt, waehrend der Rest der Anwendung weiterlaeuft. Das Ergebnis ist eine nahezu sofortige Rueckmeldung, und der Zustand der Anwendung (offene Dialoge, Formulareingaben, Router-Position, Daten im Speicher) bleibt meist erhalten.
HMR ist ein Konzept der Build- und Entwicklungsphase und gelangt nicht in die Produktion. Es macht die innere Entwicklungsschleife schneller und weniger stoerend. Weil der Zustand erhalten bleibt und das Aufblitzen eines vollstaendigen Reloads entfaellt, bleiben Entwickler im Fluss. Diese kurze Feedback-Schleife wirkt sich auch auf die Web-Performance aus: Wenn ein Layout- oder Rendering-Versuch billig ist, wird mehr experimentiert und Regressionen fallen frueher auf.
Warum HMR existiert: Full Reload, Live Reload und HMR
Frueher war ein vollstaendiger Reload bei jedem Speichern ueblich. Ein Full Reload verwirft die gesamte Seite, laedt und parst alle Assets erneut, fuehrt den Startcode erneut aus und setzt jeden Zustand zurueck. Bei grossen Single-Page-Anwendungen dauert das mehrere Sekunden, und jeder muehsam aufgebaute Zustand zur Reproduktion eines Fehlers geht verloren.
Live Reload laedt den Browser-Tab bei einer Aenderung automatisch neu, ist aber weiterhin ein Full Reload, sodass der Zustand verloren geht. HMR geht einen Schritt weiter und patcht nur die geaenderten Module. Eine CSS-Aenderung aktualisiert die Styles ganz ohne Reload; eine Komponentenaenderung rendert nur diese Komponente und ihren Teilbaum neu. Deshalb fuehlt sich HMR qualitativ anders an als Live Reload.
Wie HMR funktioniert
HMR beruht auf mehreren Bausteinen, die Bundler und Dev-Server fuer Sie verbinden.
Die HMR-Runtime
Beim Dev-Build fuegt der Bundler eine kleine HMR-Runtime in die Seite ein. Diese Runtime kennt die Module der Anwendung und weiss, wie ein einzelnes Modul zur Laufzeit im Speicher ersetzt wird.
Der Update-Kanal
Der Dev-Server ueberwacht die Quelldateien. Bei einer Aenderung kompiliert er das betroffene Modul neu und sendet eine Benachrichtigung an den Browser, meist ueber eine websocket-Verbindung. Die Runtime holt dann den neuen Modulcode und wendet ihn an.
Modulgrenzen und die accept- und dispose-API
HMR muss wissen, wie weit sich ein Update ausbreiten soll. Jedes Modul kann ueber eine HMR-API erklaeren, dass es eine neue Version akzeptiert, ueblich als import.meta.hot (Vite) oder module.hot (Webpack). Ein Modul ruft accept auf und kann einen dispose-Handler registrieren, um Nebeneffekte (Timer, Listener, Subscriptions) vor dem Verwerfen aufzuraeumen. Akzeptiert ein geaendertes Modul das Update nicht, sucht die Runtime im Abhaengigkeitsgraphen nach einem uebergeordneten Modul, das es tut. Wird bis zum Einstiegspunkt keines gefunden, faellt HMR auf einen Full Reload zurueck.
Welche Bundler und Frameworks HMR unterstuetzen
- Webpack hat HMR verbreitet und stellt es ueber die
module.hot-API bereit. - Vite bietet sehr schnelles HMR auf Basis nativer ES-Module und der
import.meta.hot-API. - Parcel liefert HMR fuer die meisten Projekte ohne Konfiguration.
- Setups auf Basis von esbuild und Rollup ergaenzen HMR ueber Plugins oder Dev-Server.
Frameworks ergaenzen zustandsbewusstes HMR. React Fast Refresh rendert bearbeitete Komponenten neu und behaelt deren Hook-Zustand nach Moeglichkeit. Vue, Svelte, Angular und SolidJS bringen eigene HMR-Behandlung mit.
Zustandserhaltung
Der zentrale Vorteil von HMR ist der erhaltene Zustand ueber eine Aenderung hinweg. Wenn Sie mitten in einem Checkout-Ablauf das Styling des Formulars anpassen, aktualisiert HMR es an Ort und Stelle und Sie bleiben in diesem Schritt. Framework-Integrationen erweitern das auf den Komponenten-Zustand: React Fast Refresh versucht, useState- und useRef-Werte zu erhalten, solange die Signatur kompatibel ist. Diese Erhaltung ist ein Best-Effort und keine Garantie. Modul-Zustand oder eine geaenderte Export-Form koennen einen Reset erzwingen.
HMR im Vergleich
| Aspekt | HMR | Live Reload | Full Reload |
|---|---|---|---|
| Zustand erhalten | Meist ja | Nein | Nein |
| Umfang des Updates | Geaendertes Modul und Abhaengige | Ganze Seite | Ganze Seite |
| Geschwindigkeit | Am schnellsten | Mittel | Am langsamsten |
| Einrichtungsaufwand | In moderner Tooling enthalten | Minimal | Keiner |
Grenzen und haeufige Fallstricke
- Nicht akzeptierende Module erzwingen einen Reload, und der Zustand geht doch verloren.
- Nebeneffekte brauchen dispose. Timer, Verbindungen oder globale Listener muessen in einem
dispose-Handler aufgeraeumt werden, sonst leckt jede Aenderung eine weitere Instanz. - Modul-Zustand ist fragil und kann beim Update zuruecksetzen.
- HMR ist nur fuer die Entwicklung. Es spiegelt niemals die Produktions-Performance wider.
Best Practices fuer zuverlaessiges HMR
- Halten Sie Module fokussiert und frei von Nebeneffekten beim Import, damit Update-Grenzen sauber bleiben.
- Registrieren Sie
dispose-Handler fuer alles Langlebige: Intervalle, Sockets, Observer und Listener. - Setzen Sie auf Framework-Integrationen wie React Fast Refresh statt handgeschriebener accept-Logik.
- Werten Sie echte Performance getrennt von der Dev-Schleife aus. Urteile ueber Ladezeit und Stabilitaet gehoeren in produktionsnahe Builds und Lasttests, nicht in den HMR-Dev-Server.
HMR-Fehlerbehebung
Gehen Sie bei Problemen systematisch vor. Passiert bei einer Aenderung nichts, pruefen Sie, ob der Dev-Server laeuft und der websocket-Update-Kanal verbunden ist. Loest jede Aenderung einen Full Reload aus, akzeptiert ein Modul im geaenderten Pfad keine Updates, also pruefen Sie Nebeneffekte beim Import. Bleibt altes Verhalten bestehen, vermuten Sie einen fehlenden dispose-Handler und starten den Dev-Server neu fuer eine saubere Basis.
FAQ zu Hot Module Replacement
Ist HMR dasselbe wie Live Reload?
Nein. Live Reload laedt die ganze Seite neu und verliert jeden Zustand, waehrend HMR nur die geaenderten Module austauscht und den Zustand meist erhaelt. HMR faellt nur dann auf einen Full Reload zurueck, wenn es eine Aenderung nicht sicher patchen kann.
Laeuft HMR in der Produktion?
Nein. HMR ist eine reine Entwicklungsfunktion des Dev-Servers und der Build-Werkzeuge. Produktions-Bundles enthalten die HMR-Runtime nicht.
Warum macht meine App bei aktivem HMR manchmal einen Full Reload?
Ein Full Reload passiert, wenn ein geaendertes Modul oder ein uebergeordnetes Modul das Update nicht akzeptiert. Findet die Runtime bis zum Einstiegspunkt keine akzeptierende Grenze, laedt sie die ganze Seite neu.
Welche Werkzeuge unterstuetzen HMR ab Werk?
Vite, Webpack und Parcel bieten HMR, und Frameworks ergaenzen zustandsbewusste Schichten wie React Fast Refresh und Vue-SFC-HMR. Die meisten modernen Setups aktivieren HMR in der Entwicklung automatisch.
Bleibt der Komponenten-Zustand bei HMR erhalten?
Oft ja, dank Integrationen wie React Fast Refresh, die den lokalen Zustand ueber Aenderungen hinweg zu erhalten versucht. Die Erhaltung ist ein Best-Effort und kann bei geaenderter Struktur zuruecksetzen.
Kann ich mich fuer Performance-Urteile auf HMR-Zeiten verlassen?
Nein. HMR spiegelt die Entwicklungserfahrung wider, nicht die Produktions-Performance. Messen Sie Ladezeit, Rendering und Stabilitaet mit produktionsnahen Builds und dediziertem Lasttest.
Verwandte Begriffe
Verwandte LoadFocus-Tools
Setze dieses Konzept mit LoadFocus in die Praxis um, derselben Plattform, die alles antreibt, was du gerade gelesen hast.