2.5.17
https://codesandbox.io/s/4k43rylw0
Laden Sie den Reproducer und machen Sie einen Snapshot des Speicherhaufens. Beim Durchsuchen des Heaps finden Sie 4 VueComponents (App, Container, Child, Async Child)
Klicken Sie auf die Schaltfläche Zerstören. Dadurch wird ein v-if umgeschaltet, wodurch die untergeordnete Komponente und damit auch die AsyncChild-Komponente entfernt werden.
Nach dem Zerstören der untergeordneten Komponente sollten die Komponente und ihre asynchron geladene untergeordnete Komponente zerstört und der Speicher freigegeben werden.
Vue hält an einer Kontextreferenz fest, die verhindert, dass diese Komponenten durch Müll gesammelt werden
Dies geschieht aufgrund der Logik der asynchronen Auflösungskomponente, die sich hier befindet: https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/core/vdom/helpers/resolve-async-component.js#L57 -68
In der forceRender-Funktion in Zeile 64 sollte nach dem Aufruf von $ forceUpdate das Contexts-Array gelöscht werden, um diese Referenzen freizugeben, damit die Komponenten zu einem späteren Zeitpunkt mit Müll gesammelt werden können
Ich kann auch eine PR für das Update für dieses Problem einreichen, danke
PR hier eingereicht: https://github.com/vuejs/vue/pull/8755
Hallo @LinusBorg
Ich sehe, dass Sie dieser Ausgabe einige Bezeichnungen hinzugefügt haben. Muss ich noch etwas tun, um den Überprüfungsprozess der referenzierten Pull-Anforderung zu starten?
Vielen Dank!
Hilfreichster Kommentar
Ich kann auch eine PR für das Update für dieses Problem einreichen, danke