From: Evan You Date: Wed, 15 Jul 2020 16:26:44 +0000 (-0400) Subject: fix(hmr): fix hmr updates for reused hoisted trees X-Git-Tag: v3.0.0-beta.22~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f61aa0f719cbd90182af1e27fad37b91c2c351e;p=thirdparty%2Fvuejs%2Fcore.git fix(hmr): fix hmr updates for reused hoisted trees fix https://github.com/vitejs/vite/issues/514 --- diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 8b2d4bc3d5..895bf064af 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -638,7 +638,31 @@ function baseCreateRenderer( optimized ) } else { - patchElement(n1, n2, parentComponent, parentSuspense, isSVG, optimized) + if ( + __DEV__ && + isHmrUpdating && + hostCloneNode !== undefined && + n2.patchFlag === PatchFlags.HOISTED + ) { + // https://github.com/vitejs/vite/issues/514 + // reused hoisted trees are inserted with cloneNode + // which makes them not patch-able. In production hoisted trees are + // never patched (because they are not collected as dynamic nodes), but + // they can be udpated during HMR. In this case just mount it as new + // and remove the stale DOM tree. + mountElement( + n2, + container, + n1.el, + parentComponent, + parentSuspense, + isSVG, + optimized + ) + hostRemove(n1.el!) + } else { + patchElement(n1, n2, parentComponent, parentSuspense, isSVG, optimized) + } } }