From bbc0849e93e2450360b023310f5f1292fca917c5 Mon Sep 17 00:00:00 2001 From: adrienbaron Date: Wed, 2 Jan 2019 15:03:35 +0100 Subject: [PATCH 1/3] fix(async component): memory leak after synchronous async loading --- .../vdom/helpers/resolve-async-component.js | 2 ++ .../modules/vdom/create-component.spec.js | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index 44ca238854f..4dbefd91fbc 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -78,6 +78,8 @@ export function resolveAsyncComponent ( // (async resolves are shimmed as synchronous during SSR) if (!sync) { forceRender(true) + } else { + contexts.length = 0 } }) diff --git a/test/unit/modules/vdom/create-component.spec.js b/test/unit/modules/vdom/create-component.spec.js index e69fca0eff3..72ec6b7d3e3 100644 --- a/test/unit/modules/vdom/create-component.spec.js +++ b/test/unit/modules/vdom/create-component.spec.js @@ -76,6 +76,32 @@ describe('create-component', () => { go() }) + it('create a component when resolved with synchronous async loading', done => { + const data = { + props: {}, + staticAttrs: { class: 'bar' } + } + spyOn(vm, '$forceUpdate') + function async (resolve, reject) { + resolve({ + name: 'child', + props: ['msg'] + }) + } + const vnode = createComponent(async, data, vm, vm) + expect(vnode.asyncFactory).toBe(async) + expect(vnode.asyncFactory.contexts.length).toEqual(0) + expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/) + expect(vnode.data.staticAttrs).toEqual({ class: 'bar' }) + expect(vnode.children).toBeUndefined() + expect(vnode.text).toBeUndefined() + expect(vnode.elm).toBeUndefined() + expect(vnode.ns).toBeUndefined() + expect(vnode.context).toEqual(vm) + expect(vm.$forceUpdate).toHaveBeenCalledTimes(0) + done() + }) + it('not create a component when rejected with async loading', done => { let vnode = null const data = { From b7d8a312362945edbd55d838e602d417b47b1379 Mon Sep 17 00:00:00 2001 From: Phan An Date: Wed, 2 Jan 2019 17:55:28 +0100 Subject: [PATCH 2/3] Update test/unit/modules/vdom/create-component.spec.js Co-Authored-By: adrienbaron --- test/unit/modules/vdom/create-component.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/modules/vdom/create-component.spec.js b/test/unit/modules/vdom/create-component.spec.js index 72ec6b7d3e3..c9dce001a3f 100644 --- a/test/unit/modules/vdom/create-component.spec.js +++ b/test/unit/modules/vdom/create-component.spec.js @@ -98,7 +98,7 @@ describe('create-component', () => { expect(vnode.elm).toBeUndefined() expect(vnode.ns).toBeUndefined() expect(vnode.context).toEqual(vm) - expect(vm.$forceUpdate).toHaveBeenCalledTimes(0) + expect(vm.$forceUpdate).not.toHaveBeenCalled() done() }) From 2a474686ebf897833e4e8ecf6746494a97ad91f9 Mon Sep 17 00:00:00 2001 From: Adrien Baron Date: Wed, 2 Jan 2019 20:53:31 +0100 Subject: [PATCH 3/3] Update test/unit/modules/vdom/create-component.spec.js --- test/unit/modules/vdom/create-component.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/modules/vdom/create-component.spec.js b/test/unit/modules/vdom/create-component.spec.js index c9dce001a3f..c5a1f717c95 100644 --- a/test/unit/modules/vdom/create-component.spec.js +++ b/test/unit/modules/vdom/create-component.spec.js @@ -98,7 +98,7 @@ describe('create-component', () => { expect(vnode.elm).toBeUndefined() expect(vnode.ns).toBeUndefined() expect(vnode.context).toEqual(vm) - expect(vm.$forceUpdate).not.toHaveBeenCalled() + expect(vm.$forceUpdate).not.toHaveBeenCalled() done() })