Vue: Vazamento de memória ao usar componentes assíncronos

Criado em 31 ago. 2018  ·  3Comentários  ·  Fonte: vuejs/vue

Versão

2.5.17

Link de reprodução

https://codesandbox.io/s/4k43rylw0

Passos para reproduzir

  1. Carregue o reprodutor e tire um instantâneo do heap da memória. Pesquisando o heap, você encontrará 4 VueComponents (App, Container, Child, Async Child)
    image

  2. Clique no botão Destruir. Isso alterna um v-if que removerá o componente filho e, portanto, o componente AsyncChild também.

  3. Neste ponto, a página é atualizada conforme o esperado
  4. Faça outro instantâneo de heap de memória. Procure no heap novamente por "VueComponent" e você verá que 4 VueComponents ainda existem
    image
    image

O que é esperado?

Depois de destruir o componente filho, o componente e seu componente filho carregado de forma assíncrona devem ser destruídos e a memória liberada.

O que realmente está acontecendo?

O Vue está mantendo uma referência de contexto que está impedindo que esses componentes sejam coletados como lixo


Isso está acontecendo devido à lógica resolve-async-component localizada aqui: https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/core/vdom/helpers/resolve-async-component.js#L57 -L68

Na função forceRender na linha 64, depois de chamar $ forceUpdate, a matriz de contextos deve ser limpa para liberar essas referências de modo que os componentes possam ser coletados como lixo em um momento posterior

bug has PR

Comentários muito úteis

Também posso enviar um PR para a correção desse problema, obrigado

Todos 3 comentários

Também posso enviar um PR para a correção desse problema, obrigado

Olá @LinusBorg

Vejo que você adicionou alguns rótulos a este problema. Há mais alguma coisa que preciso fazer para iniciar o processo de revisão da solicitação pull mencionada?

Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações