From 45d94fae012310d740f162e09c9ddf07c58f6f51 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 22 Jul 2024 15:57:00 +0200 Subject: [PATCH] fix: store a persistent HMR wrapper per component The previous HMR logic created a new wrapper and source per HMR update, which meant things would either get wrapped more and more (prior to #12454) or would not get updated after the first update because the reference to the original would get lost (after #12454). This fixes that by creating a registry within the HMR wrappers by filename are stored, retrieved and its signals updated. That way nothing gets lost, and nothing gets wrapped more than needed. Fixes #12506 --- .changeset/hip-ducks-roll.md | 5 +++ .../3-transform/client/transform-client.js | 20 ++-------- .../svelte/src/internal/client/dev/hmr.js | 39 ++++++++++++++++--- 3 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 .changeset/hip-ducks-roll.md diff --git a/.changeset/hip-ducks-roll.md b/.changeset/hip-ducks-roll.md new file mode 100644 index 0000000000..bdce28fbc4 --- /dev/null +++ b/.changeset/hip-ducks-roll.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: store a persistent HMR wrapper per component diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 0ef05eeac0..6d2dc84d59 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -417,9 +417,7 @@ export function client_component(source, analysis, options) { ); if (options.hmr) { - const accept_fn_body = [ - b.stmt(b.call('$.set', b.id('s'), b.member(b.id('module.default'), b.id('$.ORIGINAL'), true))) - ]; + const accept_fn_body = [b.stmt(b.call('$$hmr.update', b.id('module.default')))]; if (analysis.css.hash) { // remove existing `