fix(runtime-core): update devtool __vnode on patch, avoid memory leak during dev

close #11192
This commit is contained in:
Evan You 2024-06-22 20:54:46 +08:00
parent 3169c91493
commit a959781dd6
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 10 additions and 20 deletions

View File

@ -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) {

View File

@ -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