Explorar o código

fix(async component): memory leak after synchronous async loading (#9275)

fix #9229
Adrien Baron %!s(int64=7) %!d(string=hai) anos
pai
achega
d21e931396

+ 2 - 0
src/core/vdom/helpers/resolve-async-component.js

@@ -78,6 +78,8 @@ export function resolveAsyncComponent (
       // (async resolves are shimmed as synchronous during SSR)
       // (async resolves are shimmed as synchronous during SSR)
       if (!sync) {
       if (!sync) {
         forceRender(true)
         forceRender(true)
+      } else {
+        contexts.length = 0
       }
       }
     })
     })
 
 

+ 26 - 0
test/unit/modules/vdom/create-component.spec.js

@@ -76,6 +76,32 @@ describe('create-component', () => {
     go()
     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).not.toHaveBeenCalled()
+    done()
+  })
+
   it('not create a component when rejected with async loading', done => {
   it('not create a component when rejected with async loading', done => {
     let vnode = null
     let vnode = null
     const data = {
     const data = {