From 1c49f71689eba56541597edb9c455781ee0be6c2 Mon Sep 17 00:00:00 2001 From: Yang Mingshan Date: Tue, 7 Jan 2020 14:20:22 +0800 Subject: [PATCH 1/5] fix(watch): memory leak --- packages/runtime-core/src/apiReactivity.ts | 13 +++++++++++-- packages/runtime-core/src/apiWatch.ts | 5 ++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/apiReactivity.ts b/packages/runtime-core/src/apiReactivity.ts index 026c3af677a..b6860b3edb6 100644 --- a/packages/runtime-core/src/apiReactivity.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -33,11 +33,20 @@ import { import { currentInstance } from './component' +type RemoveRecord = () => void + // record effects created during a component's setup() so that they can be // stopped when the component unmounts -export function recordEffect(effect: ReactiveEffect) { +export function recordEffect(effect: ReactiveEffect): RemoveRecord | void { if (currentInstance) { - ;(currentInstance.effects || (currentInstance.effects = [])).push(effect) + const effects = currentInstance.effects || (currentInstance.effects = []) + effects.push(effect) + return () => { + const index = effects.findIndex(_effect => _effect === effect) + if (index !== -1) { + effects.splice(index, 1) + } + } } } diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 0bcfbde147e..37b984f6f63 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -214,9 +214,12 @@ function doWatch( } } - recordEffect(runner) + const removeRecord = recordEffect(runner) return () => { stop(runner) + if (removeRecord) { + removeRecord() + } } } From e7c7483bb5ddda22a1e928bdef8e8ace9f2fae8a Mon Sep 17 00:00:00 2001 From: Yang Mingshan Date: Wed, 8 Jan 2020 10:42:54 +0800 Subject: [PATCH 2/5] fix(watch): adopt suggestions --- packages/runtime-core/src/apiReactivity.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/runtime-core/src/apiReactivity.ts b/packages/runtime-core/src/apiReactivity.ts index b6860b3edb6..38e8e500054 100644 --- a/packages/runtime-core/src/apiReactivity.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -33,16 +33,14 @@ import { import { currentInstance } from './component' -type RemoveRecord = () => void - // record effects created during a component's setup() so that they can be // stopped when the component unmounts -export function recordEffect(effect: ReactiveEffect): RemoveRecord | void { +export function recordEffect(effect: ReactiveEffect): (() => void) | void { if (currentInstance) { const effects = currentInstance.effects || (currentInstance.effects = []) effects.push(effect) return () => { - const index = effects.findIndex(_effect => _effect === effect) + const index = effects.indexOf(effect) if (index !== -1) { effects.splice(index, 1) } From bc53a3d4d311e31b16e3efa48ba4003d021e321d Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 8 Jan 2020 11:57:42 -0500 Subject: [PATCH 3/5] update [ci skip] --- packages/runtime-core/src/apiReactivity.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/runtime-core/src/apiReactivity.ts b/packages/runtime-core/src/apiReactivity.ts index 38e8e500054..85154a32aef 100644 --- a/packages/runtime-core/src/apiReactivity.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -37,14 +37,7 @@ import { currentInstance } from './component' // stopped when the component unmounts export function recordEffect(effect: ReactiveEffect): (() => void) | void { if (currentInstance) { - const effects = currentInstance.effects || (currentInstance.effects = []) - effects.push(effect) - return () => { - const index = effects.indexOf(effect) - if (index !== -1) { - effects.splice(index, 1) - } - } + ;(currentInstance.effects || (currentInstance.effects = [])).push(effect) } } From cee61e02062eba34d32abf2958685ea1a03308be Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 8 Jan 2020 11:58:10 -0500 Subject: [PATCH 4/5] update [ci skip] --- packages/runtime-core/src/apiReactivity.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/apiReactivity.ts b/packages/runtime-core/src/apiReactivity.ts index 85154a32aef..026c3af677a 100644 --- a/packages/runtime-core/src/apiReactivity.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -35,7 +35,7 @@ import { currentInstance } from './component' // record effects created during a component's setup() so that they can be // stopped when the component unmounts -export function recordEffect(effect: ReactiveEffect): (() => void) | void { +export function recordEffect(effect: ReactiveEffect) { if (currentInstance) { ;(currentInstance.effects || (currentInstance.effects = [])).push(effect) } From 0e4df6e11018c7cfe70f82868eaa50e3a94d4ae4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 8 Jan 2020 11:59:32 -0500 Subject: [PATCH 5/5] Update apiWatch.ts --- packages/runtime-core/src/apiWatch.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 37b984f6f63..4760344c4af 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -214,11 +214,15 @@ function doWatch( } } - const removeRecord = recordEffect(runner) + recordEffect(runner) return () => { stop(runner) - if (removeRecord) { - removeRecord() + if (instance) { + const effects = instance.effects! + const index = effects.indexOf(runner) + if (index > -1) { + effects.splice(index, 1) + } } } }