Skip to content

Commit 573996a

Browse files
adrienbaronaJean
authored andcommitted
fix(async component): memory leak after synchronous async loading (vuejs#9275)
fix vuejs#9229
1 parent 344e71b commit 573996a

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/core/vdom/helpers/resolve-async-component.js

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export function resolveAsyncComponent (
7878
// (async resolves are shimmed as synchronous during SSR)
7979
if (!sync) {
8080
forceRender(true)
81+
} else {
82+
contexts.length = 0
8183
}
8284
})
8385

test/unit/modules/vdom/create-component.spec.js

+26
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,32 @@ describe('create-component', () => {
7676
go()
7777
})
7878

79+
it('create a component when resolved with synchronous async loading', done => {
80+
const data = {
81+
props: {},
82+
staticAttrs: { class: 'bar' }
83+
}
84+
spyOn(vm, '$forceUpdate')
85+
function async (resolve, reject) {
86+
resolve({
87+
name: 'child',
88+
props: ['msg']
89+
})
90+
}
91+
const vnode = createComponent(async, data, vm, vm)
92+
expect(vnode.asyncFactory).toBe(async)
93+
expect(vnode.asyncFactory.contexts.length).toEqual(0)
94+
expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/)
95+
expect(vnode.data.staticAttrs).toEqual({ class: 'bar' })
96+
expect(vnode.children).toBeUndefined()
97+
expect(vnode.text).toBeUndefined()
98+
expect(vnode.elm).toBeUndefined()
99+
expect(vnode.ns).toBeUndefined()
100+
expect(vnode.context).toEqual(vm)
101+
expect(vm.$forceUpdate).not.toHaveBeenCalled()
102+
done()
103+
})
104+
79105
it('not create a component when rejected with async loading', done => {
80106
let vnode = null
81107
const data = {

0 commit comments

Comments
 (0)