From a959781dd6f609dcb6f16dd7fa47d3b16895e5ca Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 22 Jun 2024 20:54:46 +0800 Subject: [PATCH] fix(runtime-core): update devtool __vnode on patch, avoid memory leak during dev close #11192 --- packages/runtime-core/src/hydration.ts | 15 +++------------ packages/runtime-core/src/renderer.ts | 15 +++++++-------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index 9376604b16f..8eca0705dfd 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -17,6 +17,7 @@ import { warn } from './warning' import { PatchFlags, ShapeFlags, + def, includeBooleanAttr, isBooleanAttr, isKnownHtmlAttr, @@ -141,18 +142,8 @@ export function createHydrationFunctions( vnode.el = node if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) { - if (!('__vnode' in node)) { - Object.defineProperty(node, '__vnode', { - value: vnode, - enumerable: false, - }) - } - if (!('__vueParentComponent' in node)) { - Object.defineProperty(node, '__vueParentComponent', { - value: parentComponent, - enumerable: false, - }) - } + def(node, '__vnode', vnode, true) + def(node, '__vueParentComponent', parentComponent, true) } if (patchFlag === PatchFlags.BAIL) { diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index c14c68d7823..d5c5b6d8dfb 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -33,6 +33,7 @@ import { NOOP, PatchFlags, ShapeFlags, + def, getGlobalThis, invokeArrayFns, isArray, @@ -696,15 +697,10 @@ function baseCreateRenderer( } if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) { - Object.defineProperty(el, '__vnode', { - value: vnode, - enumerable: false, - }) - Object.defineProperty(el, '__vueParentComponent', { - value: parentComponent, - enumerable: false, - }) + def(el, '__vnode', vnode, true) + def(el, '__vueParentComponent', parentComponent, true) } + if (dirs) { invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount') } @@ -805,6 +801,9 @@ function baseCreateRenderer( optimized: boolean, ) => { const el = (n2.el = n1.el!) + if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) { + el.__vnode = n2 + } let { patchFlag, dynamicChildren, dirs } = n2 // #1426 take the old vnode's patch flag into account since user may clone a // compiler-generated vnode, which de-opts to FULL_PROPS