Hot Reload es una tecnología mediante la cual los cambios en el código fuente se aplican a una aplicación en ejecución sin recargar completamente la página y sin perder el estado actual. A diferencia de Live Reload, que simplemente actualiza la página entera, la recarga en caliente reemplaza solo los módulos modificados sobre la marcha. Según Webpack, 2024, Hot Module Replacement (HMR) reduce el tiempo del ciclo de desarrollo hasta en un 80% al preservar el estado de los componentes.
Puntos clave
Hot Reload es un mecanismo de desarrollo mediante el cual los cambios en los archivos fuente se reflejan inmediatamente en una aplicación en ejecución sin reiniciarla. El desarrollador edita el código en el editor, guarda el archivo y el resultado es visible al instante en el navegador o emulador.
La característica clave de esta tecnología es la preservación del estado de la aplicación. Las variables en memoria, los datos en formularios, la navegación actual — todo permanece en su lugar. El desarrollador no necesita repetir una secuencia de acciones para volver a la pantalla requerida.
En el desarrollo web, Hot Reload se implementa a través del mecanismo Hot Module Replacement (HMR). El empaquetador monitorea los cambios en los archivos, determina qué módulos están afectados y envía el código actualizado al navegador mediante WebSocket. El navegador reemplaza solo esos módulos sin recargar la página.
La popularidad de Hot Reload se disparó con el auge de las aplicaciones de página única (SPA), donde una recarga completa de la página destruye todo el estado de la aplicación cliente. React, Vue, Angular y otros frameworks recomiendan HMR como modo principal de desarrollo.
El mecanismo HMR consta de cuatro etapas. El empaquetador del lado del servidor compila el módulo modificado, genera un parche JSON con la nueva versión del código y lo envía al navegador a través de una conexión WebSocket. El runtime HMR del lado del navegador recibe el parche, reemplaza el módulo antiguo por el nuevo y notifica a los suscriptores del módulo.
Webpack Dev Server utiliza WebSocket para comunicarse con el cliente. Cuando un archivo cambia, el empaquetador genera hot-update.js y hot-update.json con un manifiesto de cambios. El cliente carga automáticamente estos archivos mediante JSONP.
// webpack.config.js - configuración HMR
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
liveReload: false
},
plugins: [new HtmlWebpackPlugin()]
};
El runtime HMR en el navegador verifica si el módulo que se reemplaza admite accept. Si el módulo ha declarado module.hot.accept(), el runtime lo reemplaza in-place y ejecuta el callback de actualización. Si no se declara accept, HMR retrocede al nivel del módulo padre.
En React Fast Refresh, esta lógica está integrada a nivel del framework — no es necesario escribir manualmente module.hot.accept en cada archivo. El plugin de Babel react-refresh/babel agrega código que reemplaza componentes de forma segura sin perder el estado.
Estos tres términos a menudo se confunden, pero difieren radicalmente en su comportamiento. Live Reload recarga toda la página ante cualquier cambio — todo el estado se pierde. Full Reload ocurre cuando el servidor de desarrollo se reinicia por completo, perdiendo no solo el estado del cliente sino también el del servidor.
| Tipo | Recarga de página | Preservación de estado | Velocidad |
|---|---|---|---|
| Hot Reload (HMR) | No | Sí | Instantáneo |
| Live Reload | Sí | No | 1-3 seg |
| Full Reload | Sí | No | 3-10 seg |
La elección entre Hot y Live afecta directamente la velocidad de desarrollo. Con HMR, el ciclo “editar código → ver resultado” toma 50-200 ms. Con Live Reload — 1-3 segundos más el tiempo de restauración del contexto. A lo largo de un día laboral, la diferencia asciende a decenas de minutos de tiempo ahorrado.
React Fast Refresh es la implementación oficial de Hot Reload optimizada para componentes de React. Reemplazó el antiguo mecanismo React Hot Loader, que era inestable y requería configuración manual. Fast Refresh está integrado en Create React App, Next.js, Vite y Webpack a través de react-refresh/babel.
Fast Refresh preserva correctamente el estado de los componentes funcionales cuando su código cambia. Si solo cambia el marcado JSX, useState y otros hooks conservan sus valores. Si cambia la lógica del hook, el componente se vuelve a montar.
// Ejemplo: el estado se conserva cuando cambia JSX
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 no preserva el estado si el nuevo código contiene un error de compilación. Si el componente no se exporta por defecto (named export), es posible que el estado tampoco se conserve. Se recomienda usar export default para los componentes y envolver las exportaciones en memo si se necesita garantizar la preservación del estado.
Los empaquetadores modernos proporcionan HMR. Webpack es el pionero de HMR con configuración flexible a través de devServer.hot. Vite usa ESM nativo y esbuild para HMR instantáneo sin empaquetado. Parcel ofrece HMR zero-config. Turbopack es un nuevo empaquetador de Vercel con HMR basado en Rust.
| Herramienta | Tipo de HMR | Configuración | Ecosistema |
|---|---|---|---|
| Webpack 5 | HMR mediante WebSocket | devServer.hot: true | React, Vue, Angular |
| Vite | HMR con ESM nativo | Integrado | React, Vue, Svelte |
| Parcel 2 | HMR zero-config | No requerido | React, Vue, TS |
| Turbopack | HMR incremental | Integrado | Next.js |
Vite destaca en velocidad — HMR en Vite funciona a través de módulos ES nativos del navegador. Cuando un archivo cambia, Vite envía solo ese módulo mediante import(), sin recompilar todo el proyecto. Webpack compila cada módulo por completo, lo que ralentiza HMR en proyectos grandes.
Veamos la configuración de HMR para diferentes empaquetadores. En Webpack, hay que establecer hot: true en devServer y agregar react-refresh/babel. En Vite, HMR funciona de fábrica con cualquier preset. En Next.js, Fast Refresh está habilitado por defecto mediante el turbocompilador.
// 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 no funciona correctamente en todos los escenarios. Los módulos CSS con clases dinámicas pueden no aplicarse. Las variables globales y singletons (store de Redux, router) pueden reiniciarse al recargar. Las bibliotecas pesadas con HMR a veces pueden generar fugas de memoria debido al reemplazo de módulos sin GC.
La solución a los problemas de HMR es aislar el código caliente en componentes puros sin efectos secundarios. Los efectos secundarios (suscripciones a WebSocket, temporizadores) deben limpiarse en useEffect. Para Redux, se recomienda un persister que guarde el estado en sessionStorage. Las soluciones CSS como CSS Modules o styled-components funcionan correctamente con HMR sin configuración adicional.
Otra limitación es la depuración en producción: HMR se desactiva intencionalmente en las compilaciones de producción. El código fuente está minificado y el reemplazo en caliente en producción es imposible. Para depurar errores en producción, se usan source maps y registro, pero no HMR.
Preguntas frecuentes
Hot Reload reemplaza solo el módulo modificado sin recargar la página y conserva el estado. Live Reload recarga toda la página — el estado se pierde, la aplicación se inicia de nuevo desde la pantalla inicial.
En proyectos con Create React App y Vite, HMR está activado por defecto. En Webpack, hay que agregar devServer: { hot: true } y @pmmmwh/react-refresh-webpack-plugin. En Next.js, Fast Refresh funciona sin configuración.
La causa es un error de compilación en el nuevo código, un named export en lugar de default, un cambio en la firma del hook o una mutación directa del estado. React Fast Refresh reinicia el componente de forma segura solo cuando es necesario para el correcto funcionamiento.
Sí, todos los empaquetadores modernos soportan HMR con TypeScript. Vite usa esbuild para la transpilación de TS. Webpack usa ts-loader o babel con @babel/preset-typescript. Fast Refresh funciona correctamente con componentes tipados.
Verifica la consola del navegador para ver errores de conexión WebSocket. Asegúrate de que devServer.hot: true esté activado. Para Vite, verifica el puerto de HMR. Si el problema persiste, realiza una recarga completa de la página (F5) y verifica la consola del empaquetador.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también