Vue: 非同期コンポーネント使用時のメモリリーク

作成日 2018年08月31日  ·  3コメント  ·  ソース: vuejs/vue

バージョン

2.5.17

複製リンク

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

再現する手順

  1. 再生装置をロードし、メモリヒープのスナップショットを作成します。 ヒープを検索すると、4つのVueComponents(App、Container、Child、Async Child)が見つかります。
    image

  2. [破棄]ボタンをクリックします。 これにより、v-ifが切り替わり、子コンポーネントが削除され、AsyncChildコンポーネントも削除されます。

  3. この時点で、ページは期待どおりに更新されます
  4. 別のメモリヒープスナップショットを取ります。 ヒープで「VueComponent」を再度検索すると、4つのVueComponentがまだ存在していることがわかります。
    image
    image

何が期待されますか?

子コンポーネントを破棄した後、コンポーネントとその非同期にロードされた子コンポーネントを破棄し、メモリを解放する必要があります。

実際に何が起こっているのですか?

Vueは、これらのコンポーネントがガベージコレクションされるのを防いでいるコンテキスト参照を保持しています


これは、次の場所にあるresolve-async-componentロジックが原因で発生しています: https

64行目のforceRender関数で、$ forceUpdateを呼び出した後、コンテキスト配列をクリアしてこれらの参照を解放し、コンポーネントを後でガベージコレクションできるようにする必要があります。

bug has PR

最も参考になるコメント

この問題の修正についてもPRを提出できます。ありがとうございます。

全てのコメント3件

この問題の修正についてもPRを提出できます。ありがとうございます。

ここに提出されたPR: https

こんにちは@LinusBorg

この問題にいくつかのラベルを追加したようです。 参照されたプルリクエストのレビュープロセスを開始するために他に必要なことはありますか?

ありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価