فهرست منبع

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

fix #9229
Adrien Baron 7 سال پیش
والد
کامیت
d21e931396
2فایلهای تغییر یافته به همراه28 افزوده شده و 0 حذف شده
  1. 2 0
      src/core/vdom/helpers/resolve-async-component.js
  2. 26 0
      test/unit/modules/vdom/create-component.spec.js

+ 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)
       if (!sync) {
         forceRender(true)
+      } else {
+        contexts.length = 0
       }
     })
 

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