HMR / rechargement à chaud

En mode dev, le runtime client de bext fait du rechargement à chaud avec préservation de l'état : à chaque rebuild, les blocs <style> sont échangés à chaud (CSS instantané), le contenu de <main> est remplacé, et l'état vivant des îlots à reprise (valeurs des signaux) est capturé puis restauré — votre compteur, vos champs, votre défilement survivent à l'édition.

Astuce
Essayez ici : ouvrez la console et tapez window.__bextHmr.snapshot(), incrémentez le compteur de la page « Reprise », puis rechargez — la valeur est conservée (un seul coup : un second rechargement repart à zéro). C'est la moitié difficile du HMR (la préservation de l'état), entièrement côté client, sans risque pour le bundle.

Ce qui marche aujourd'hui

  • Échange de module en place (window.__bextHmr.swapIsland) : éditez un îlot → le nouveau code est actif, l'état préservé, SANS rechargement.
  • CSS à chaud : les blocs <style> sont remplacés sans rechargement.
  • Échange de contenu : <main> est remplacé en place, les îlots se re-montent avec le nouveau code.
  • Préservation de l'état : les signaux des îlots survivent (snapshot → restore, un seul coup).
  • Événement bext:navigated pour ré-initialiser les scripts de contenu.

Ce qui reste (l'arc plus profond)

  • Hot-swap des modules SSR côté serveur (live-binding via thunks __bextRebind dans le contexte V8 chaud) — ~60 % construit, BEXT_DEV_MODE ; le plan le juge marginal (bext recompile déjà en incrémental).

Activation

layout.tsxTSX
import { clientRuntimeBody } from "@bext-stack/framework/client";

// Dev mode: live-reload with state preservation.
<script dangerouslySetInnerHTML={{ __html:
  clientRuntimeBody({ navigation: true, liveReload: true })
}} />

// On a rebuild event the runtime:
//   1. hot-swaps <style> blocks (CSS edits are instant, no flash)
//   2. swaps the <main> content in place
//   3. snapshots each resumable island's LIVE signal values, and on the
//      next mount restores them — so your counter / form / scroll survive
//      the edit instead of resetting.

// The snapshot channel is also exposed for manual use:
window.__bextHmr.snapshot();   // before a reload