Reemplazo de Módulos Calientes (HMR)

Descubre como Hot Module Replacement (HMR) intercambia modulos en tiempo de ejecucion sin recarga completa: como funciona, bundlers y buenas practicas.

Que es Hot Module Replacement (HMR)?

Hot Module Replacement (HMR) es una funcion del servidor de desarrollo que intercambia, agrega o elimina modulos de JavaScript y CSS en una aplicacion en ejecucion sin recargar la pagina por completo. Cuando guardas un archivo, solo se vuelven a evaluar el modulo modificado y sus dependientes directos, que se inyectan en la pagina activa mientras el resto de la aplicacion sigue funcionando. El resultado es una respuesta casi instantanea, y el estado de la aplicacion (dialogos abiertos, entradas de formulario, posicion del router, datos en memoria) suele conservarse.

HMR es un concepto de la fase de compilacion y desarrollo, y no llega a produccion. Hace que el ciclo interno de desarrollo sea mas rapido y menos disruptivo. Como conserva el estado y evita el parpadeo de una recarga completa, mantiene el enfoque de quien programa. Ese ciclo corto tambien influye en el rendimiento web: cuando probar un cambio de diseno es barato, experimentas mas y detectas regresiones antes.

Por que existe HMR: recarga completa, live reload y HMR

Antes lo comun era una recarga completa en cada guardado. Una recarga completa descarta toda la pagina, vuelve a descargar y analizar cada recurso, ejecuta de nuevo el codigo de arranque y reinicia todo el estado. En una aplicacion de una sola pagina grande eso puede tardar varios segundos, y cualquier estado que preparaste para reproducir un error se pierde.

El live reload recarga la pestana del navegador automaticamente ante un cambio, pero por debajo sigue siendo una recarga completa, asi que el estado se pierde. HMR va un paso mas alla y parchea solo los modulos que cambiaron. Un cambio de CSS actualiza los estilos sin recarga alguna; un cambio de componente vuelve a renderizar solo ese componente y su subarbol. Por eso HMR se siente distinto del live reload, no solo mas rapido.

Como funciona HMR por dentro

HMR se apoya en varias piezas que el bundler y el servidor de desarrollo conectan por ti.

El runtime de HMR

En una compilacion de desarrollo, el bundler inyecta un pequeno runtime de HMR en la pagina. Ese runtime conoce los modulos de la aplicacion y sabe reemplazar un modulo individual en memoria en tiempo de ejecucion.

El canal de actualizacion

El servidor de desarrollo observa tus archivos fuente. Cuando algo cambia, recompila el modulo afectado y envia una notificacion al navegador, normalmente por una conexion websocket. El runtime obtiene el codigo nuevo y lo aplica.

Limites de modulo y la API accept y dispose

HMR necesita saber hasta donde debe propagarse una actualizacion. Cada modulo puede declarar que acepta una nueva version mediante una API de HMR, expuesta habitualmente como import.meta.hot (Vite) o module.hot (Webpack). Un modulo llama a accept y puede registrar un manejador dispose para limpiar efectos secundarios (temporizadores, listeners, suscripciones) antes de descartar la version antigua. Si un modulo modificado no acepta la actualizacion, el runtime sube por el grafo de dependencias buscando un ancestro que si lo haga. Si llega al punto de entrada sin encontrarlo, HMR recurre a una recarga completa.

Que bundlers y frameworks admiten HMR

  • Webpack popularizo HMR y lo expone mediante la API module.hot.
  • Vite ofrece un HMR muy rapido basado en modulos ES nativos y la API import.meta.hot.
  • Parcel incluye HMR sin configuracion para la mayoria de proyectos.
  • Los montajes basados en esbuild y Rollup anaden HMR con plugins o servidores de desarrollo.

Los frameworks agregan HMR con estado. React Fast Refresh vuelve a renderizar los componentes editados conservando su estado de hooks cuando es posible. Vue, Svelte, Angular y SolidJS traen su propio manejo de HMR.

Conservacion del estado

La ventaja principal de HMR es que conserva el estado a traves de una edicion. Si estas a mitad de un flujo de compra y ajustas el estilo del formulario, HMR lo actualiza en su sitio y sigues en ese paso. Las integraciones de framework lo extienden al estado del componente: React Fast Refresh intenta conservar los valores de useState y useRef mientras la firma sea compatible. Esta conservacion es de mejor esfuerzo, no una garantia: editar un archivo con estado a nivel de modulo o cambiar la forma exportada puede forzar un reinicio.

HMR en comparacion

AspectoHMRLive reloadRecarga completa
Estado conservadoCasi siempreNoNo
Alcance de la actualizacionModulo cambiado y dependientesPagina enteraPagina entera
VelocidadLa mas rapidaMediaLa mas lenta
Esfuerzo de configuracionIncluido en tooling modernoMinimoNinguno

Limitaciones y errores comunes

  • Los modulos que no aceptan fuerzan una recarga y pierdes el estado igualmente.
  • Los efectos secundarios necesitan dispose. Los temporizadores, conexiones o listeners globales deben limpiarse en un manejador dispose, o cada edicion filtra otra instancia.
  • El estado a nivel de modulo es fragil y puede reiniciarse en una actualizacion.
  • HMR es solo para desarrollo. Nunca refleja el rendimiento de produccion.

Buenas practicas para un HMR fiable

  • Manten los modulos enfocados y sin efectos secundarios al importar para que los limites de actualizacion queden limpios.
  • Registra manejadores dispose para todo lo persistente: intervalos, sockets, observers y listeners.
  • Apoyate en integraciones como React Fast Refresh en lugar de escribir logica de accept a mano.
  • Evalua el rendimiento real por separado del ciclo de desarrollo. Los juicios sobre tiempo de carga y estabilidad pertenecen a compilaciones similares a produccion y a pruebas de carga, no al servidor de desarrollo con HMR.

Resolucion de problemas de HMR

Cuando HMR falla, procede con metodo. Si una edicion no hace nada, confirma que el servidor de desarrollo esta activo y que el canal de actualizacion websocket esta conectado. Si cada edicion dispara una recarga completa, algun modulo del camino modificado no acepta actualizaciones, asi que revisa los efectos secundarios al importar. Si persiste un comportamiento antiguo, sospecha de un manejador dispose ausente y reinicia el servidor de desarrollo para partir de una base limpia.

FAQ sobre Hot Module Replacement

Es HMR lo mismo que live reload?

No. El live reload recarga toda la pagina y pierde el estado, mientras que HMR intercambia solo los modulos cambiados y suele conservar el estado. HMR recurre a una recarga completa solo cuando no puede parchear un cambio de forma segura.

Se ejecuta HMR en produccion?

No. HMR es una funcion exclusiva del servidor de desarrollo y las herramientas de compilacion. Los bundles de produccion no incluyen el runtime de HMR.

Por que mi app a veces hace una recarga completa con HMR activo?

Ocurre cuando un modulo cambiado, o alguno de sus ancestros, no acepta la actualizacion. El runtime sube por el grafo de dependencias y, si no halla un limite que acepte antes del punto de entrada, recarga toda la pagina.

Que herramientas admiten HMR de forma nativa?

Vite, Webpack y Parcel ofrecen HMR, y los frameworks anaden capas con estado como React Fast Refresh y el HMR de componentes de archivo unico de Vue. La mayoria de los montajes modernos activan HMR en desarrollo de forma automatica.

Conserva HMR el estado de los componentes?

A menudo si, gracias a integraciones como React Fast Refresh, que intenta mantener el estado local entre ediciones. La conservacion es de mejor esfuerzo, asi que cambiar la forma de un componente puede reiniciarlo.

Puedo fiarme de los tiempos de HMR para juzgar el rendimiento?

No. HMR refleja la experiencia de desarrollo, no el rendimiento de produccion. Mide el tiempo de carga real, el renderizado y la estabilidad con compilaciones similares a produccion y pruebas de carga dedicadas.

¿Qué tan rápido es tu sitio web?

Mejora su velocidad y SEO sin problemas con nuestra Prueba de Velocidad gratuita.

Prueba de velocidad de sitio web gratis

Analice la velocidad de carga de su sitio web y mejore su rendimiento con nuestro comprobador de velocidad de página gratuito.

×