Hot Reload ist eine Technologie, bei der Änderungen im Quellcode auf eine laufende Anwendung angewendet werden, ohne die Seite vollständig neu zu laden und ohne den aktuellen Zustand zu verlieren. Im Gegensatz zu Live Reload, das einfach die gesamte Seite aktualisiert, ersetzt das heiße Nachladen nur die geänderten Module im laufenden Betrieb. Laut Webpack, 2024 reduziert Hot Module Replacement (HMR) die Entwicklungszykluszeit um bis zu 80 %, indem der Zustand der Komponenten erhalten bleibt.
Wichtige Punkte
Hot Reload ist ein Entwicklungsmechanismus, bei dem Änderungen an den Quelldateien sofort in einer laufenden Anwendung reflektiert werden, ohne sie neu zu starten. Der Entwickler bearbeitet den Code im Editor, speichert die Datei, und das Ergebnis ist sofort im Browser oder Emulator sichtbar.
Das Hauptmerkmal dieser Technologie ist die Erhaltung des Anwendungszustands. Variablen im Speicher, Daten in Formularen, aktuelle Navigation — alles bleibt erhalten. Der Entwickler muss keine Abfolge von Aktionen wiederholen, um zum gewünschten Bildschirm zurückzukehren.
In der Webentwicklung wird Hot Reload durch den Mechanismus Hot Module Replacement (HMR) implementiert. Der Bundler überwacht Dateiänderungen, ermittelt, welche Module betroffen sind, und sendet den aktualisierten Code über WebSocket an den Browser. Der Browser ersetzt nur diese Module, ohne die Seite neu zu laden.
Die Popularität von Hot Reload stieg mit der Verbreitung von Single-Page-Anwendungen (SPAs), bei denen ein vollständiges Neuladen der Seite den gesamten Zustand der Client-Anwendung zerstört. React, Vue, Angular und andere Frameworks empfehlen HMR als primären Entwicklungsmodus.
Der HMR-Mechanismus besteht aus vier Phasen. Der Bundler auf der Serverseite kompiliert das geänderte Modul, erstellt einen JSON-Patch mit der neuen Codeversion und sendet ihn über eine WebSocket-Verbindung an den Browser. Die browserbasierte HMR-Laufzeitumgebung empfängt den Patch, ersetzt das alte Modul durch das neue und benachrichtigt die Abonnenten des Moduls.
Webpack Dev Server verwendet WebSocket zur Kommunikation mit dem Client. Wenn sich eine Datei ändert, erstellt der Bundler hot-update.js und hot-update.json mit einem Manifest der Änderungen. Der Client lädt diese Dateien automatisch über JSONP.
// webpack.config.js - HMR-Setup
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
liveReload: false
},
plugins: [new HtmlWebpackPlugin()]
};
Die HMR-Laufzeitumgebung im Browser prüft, ob das zu ersetzende Modul accept unterstützt. Wenn das Modul module.hot.accept() deklariert hat, ersetzt die Laufzeitumgebung es direkt und führt den Aktualisierungsrückruf aus. Wenn accept nicht deklariert ist, fällt HMR auf die Ebene des Elternmoduls zurück.
In React Fast Refresh ist diese Logik auf Framework-Ebene integriert — es ist nicht nötig, manuell module.hot.accept in jede Datei zu schreiben. Das Babel-Plugin react-refresh/babel fügt Code hinzu, der Komponenten sicher ersetzt, ohne den Zustand zu verlieren.
Diese drei Begriffe werden oft verwechselt, unterscheiden sich jedoch grundlegend im Verhalten. Live Reload lädt die gesamte Seite bei jeder Änderung neu — der gesamte Zustand geht verloren. Full Reload tritt auf, wenn der Entwicklungsserver vollständig neu gestartet wird, wobei nicht nur der Client-, sondern auch der Serverzustand verloren geht.
| Typ | Seitenneuladen | Zustandserhaltung | Geschwindigkeit |
|---|---|---|---|
| Hot Reload (HMR) | Nein | Ja | Sofort |
| Live Reload | Ja | Nein | 1-3 Sek |
| Full Reload | Ja | Nein | 3-10 Sek |
Die Wahl zwischen Hot und Live wirkt sich direkt auf die Entwicklungsgeschwindigkeit aus. Mit HMR dauert der Zyklus „Code bearbeiten → Ergebnis sehen“ 50-200 ms. Bei Live Reload sind es 1-3 Sekunden zuzüglich der Zeit für die Kontextwiederherstellung. Über einen Arbeitstag summiert sich der Unterschied auf Dutzende Minuten eingesparter Zeit.
React Fast Refresh ist die offizielle, für React-Komponenten optimierte Hot-Reload-Implementierung. Sie ersetzte den alten React Hot Loader-Mechanismus, der instabil war und manuelle Konfiguration erforderte. Fast Refresh ist in Create React App, Next.js, Vite und Webpack über react-refresh/babel integriert.
Fast Refresh bewahrt den Zustand funktionaler Komponenten korrekt, wenn sich ihr Code ändert. Wenn Sie nur das JSX-Markup ändern, behalten useState und andere Hooks ihre Werte. Wenn sich die Hook-Logik ändert, wird die Komponente erneut gemountet.
// Beispiel - Zustand bleibt bei JSX-Änderungen erhalten
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 bewahrt den Zustand nicht, wenn der neue Code einen Kompilierungsfehler enthält. Wenn die Komponente nicht standardmäßig exportiert wird (named export), kann der Zustand ebenfalls nicht erhalten bleiben. Es wird empfohlen, default export für Komponenten zu verwenden und Exporte in memo zu verpacken, wenn die Zustandserhaltung garantiert werden muss.
Moderne Bundler bieten HMR. Webpack ist der Pionier von HMR mit flexibler Konfiguration über devServer.hot. Vite verwendet natives ESM und esbuild für sofortiges HMR ohne Bündelung. Parcel bietet Zero-Config-HMR. Turbopack ist ein neuer Bundler von Vercel mit Rust-basiertem HMR.
| Tool | HMR-Typ | Konfiguration | UKosystem |
|---|---|---|---|
| Webpack 5 | HMR über WebSocket | devServer.hot: true | React, Vue, Angular |
| Vite | Natives ESM HMR | Integriert | React, Vue, Svelte |
| Parcel 2 | Zero-Config HMR | Nicht erforderlich | React, Vue, TS |
| Turbopack | Inkrementelles HMR | Integriert | Next.js |
Vite zeichnet sich durch Geschwindigkeit aus — HMR in Vite funktioniert über native ES-Module des Browsers. Wenn sich eine Datei ändert, sendet Vite nur dieses Modul über import(), ohne das gesamte Projekt neu zu kompilieren. Webpack kompiliert jedes Modul vollständig, was HMR in großen Projekten verlangsamt.
Schauen wir uns die HMR-Einrichtung für verschiedene Bundler an. In Webpack muss hot: true im devServer gesetzt und react-refresh/babel hinzugefügt werden. In Vite funktioniert HMR integriert mit jeder Voreinstellung. In Next.js ist Fast Refresh standardmäßig über den Turbokompilierer aktiviert.
// 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'
}
]
}
};
HMR funktioniert nicht in allen Szenarien korrekt. CSS-Module mit dynamischen Klassen werden möglicherweise nicht angewendet. Globale Variablen und Singletons (Redux-Store, Router) können beim Neuladen zurückgesetzt werden. Schwere Bibliotheken können bei HMR manchmal Speicherlecks aufgrund von Modulaustausch ohne GC verursachen.
Die Lösung für HMR-Probleme besteht darin, heißen Code in reine Komponenten ohne Nebenwirkungen zu isolieren. Nebenwirkungen (WebSocket-Abonnements, Timer) sollten in useEffect bereinigt werden. Für Redux wird ein Persister empfohlen, der den Zustand im sessionStorage speichert. CSS-Lösungen wie CSS Modules oder styled-components funktionieren ohne zusätzliche Konfiguration korrekt mit HMR.
Eine weitere Einschränkung ist das Debuggen in der Produktion: HMR wird in Produktions-Builds absichtlich deaktiviert. Der Quellcode ist minimiert und ein heißer Austausch in der Produktion ist unmöglich. Zum Debuggen von Fehlern in der Produktion verwenden Sie Source Maps und Logging, aber nicht HMR.
Häufig gestellte Fragen
Hot Reload ersetzt nur das geänderte Modul ohne Neuladen der Seite und bewahrt den Zustand. Live Reload lädt die gesamte Seite neu — der Zustand geht verloren, die Anwendung startet vom Startbildschirm aus neu.
In Projekten mit Create React App und Vite ist HMR standardmäßig aktiviert. In Webpack müssen devServer: { hot: true } und @pmmmwh/react-refresh-webpack-plugin hinzugefügt werden. In Next.js funktioniert Fast Refresh ohne Konfiguration.
Die Ursache ist ein Kompilierungsfehler im neuen Code, ein named Export statt default, eine Änderung der Hook-Signatur oder eine direkte Zustandsmutation. React Fast Refresh setzt die Komponente nur dann sicher zurück, wenn es für den korrekten Betrieb erforderlich ist.
Ja, alle modernen Bundler unterstützen HMR mit TypeScript. Vite verwendet esbuild für die TS-Transpilation. Webpack verwendet ts-loader oder babel mit @babel/preset-typescript. Fast Refresh funktioniert korrekt mit typisierten Komponenten.
Prüfen Sie die Browserkonsole auf WebSocket-Verbindungsfehler. Stellen Sie sicher, dass devServer.hot: true aktiviert ist. Für Vite, prüfen Sie den HMR-Port. Wenn das Problem bestehen bleibt, führen Sie ein vollständiges Neuladen der Seite (F5) durch und prüfen Sie die Bundler-Konsole.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch