From: Evan You Date: Wed, 28 Sep 2022 10:19:19 +0000 (+0800) Subject: fix(devtools): avoid memory leak caused by devtools event buffer X-Git-Tag: v3.2.41~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=24f4c479d661698afd967cf428f9439be4578a04;p=thirdparty%2Fvuejs%2Fcore.git fix(devtools): avoid memory leak caused by devtools event buffer fix #6591 --- diff --git a/packages/runtime-core/src/devtools.ts b/packages/runtime-core/src/devtools.ts index 36c5763dcf..83d7483df3 100644 --- a/packages/runtime-core/src/devtools.ts +++ b/packages/runtime-core/src/devtools.ts @@ -28,6 +28,7 @@ interface DevtoolsHook { once: (event: string, handler: Function) => void off: (event: string, handler: Function) => void appRecords: AppRecord[] + _buffer: any[][] } export let devtools: DevtoolsHook @@ -101,8 +102,26 @@ export const devtoolsComponentAdded = /*#__PURE__*/ createDevtoolsComponentHook( export const devtoolsComponentUpdated = /*#__PURE__*/ createDevtoolsComponentHook(DevtoolsHooks.COMPONENT_UPDATED) -export const devtoolsComponentRemoved = - /*#__PURE__*/ createDevtoolsComponentHook(DevtoolsHooks.COMPONENT_REMOVED) +const _devtoolsComponentRemoved = /*#__PURE__*/ createDevtoolsComponentHook( + DevtoolsHooks.COMPONENT_REMOVED +) + +export const devtoolsComponentRemoved = ( + component: ComponentInternalInstance +) => { + if (devtools && devtools._buffer.length) { + let wasBuffered = false + devtools._buffer = devtools._buffer.filter(item => { + if (item.some(arg => arg === component)) { + wasBuffered = true + return false + } + return true + }) + if (wasBuffered) return + } + _devtoolsComponentRemoved(component) +} function createDevtoolsComponentHook(hook: DevtoolsHooks) { return (component: ComponentInternalInstance) => {