Vue: تسرب الذاكرة عند استخدام مكونات غير متزامنة

تم إنشاؤها على ٣١ أغسطس ٢٠١٨  ·  3تعليقات  ·  مصدر: vuejs/vue

الإصدار

2.5.17

رابط الاستنساخ

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

خطوات التكاثر

  1. قم بتحميل الناسخ وأخذ لقطة لكومة الذاكرة. عند البحث في الكومة ، ستجد 4 VueComponents (تطبيق ، حاوية ، طفل ، Async Child)
    image

  2. انقر فوق الزر إتلاف. يؤدي هذا إلى تبديل v-if الذي سيزيل المكون الفرعي وبالتالي مكون AsyncChild أيضًا.

  3. في هذه المرحلة ، يتم تحديث الصفحة بالشكل المتوقع
  4. خذ لقطة أخرى لكومة الذاكرة. ابحث في الكومة مرة أخرى عن "VueComponent" وسترى أن 4 VueComponents لا تزال موجودة
    image
    image

ما هو متوقع؟

بعد إتلاف المكون التابع ، يجب إتلاف المكون والمكون الفرعي الذي تم تحميله بشكل غير متزامن وتحرير الذاكرة.

ما الذي يحدث بالفعل؟

يحتفظ Vue بمرجع السياق الذي يمنع هذه المكونات من جمع القمامة


يحدث هذا بسبب منطق حل عدم التزامن الموجود هنا: https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/core/vdom/helpers/resolve-async-component.js#L57 -L68

في وظيفة forceRender في السطر 64 ، بعد استدعاء $ forceUpdate ، يجب مسح مصفوفة السياقات لتحرير تلك المراجع بحيث يمكن تجميع المكونات غير المرغوب فيها في وقت لاحق

bug has PR

التعليق الأكثر فائدة

يمكنني إرسال بيان عام لإصلاح هذه المشكلة أيضًا ، شكرًا

ال 3 كومينتر

يمكنني إرسال بيان عام لإصلاح هذه المشكلة أيضًا ، شكرًا

تم تقديم العلاقات العامة هنا: https://github.com/vuejs/vue/pull/8755

مرحبًا LinusBorg

أرى أنك أضفت بعض التصنيفات لهذه المشكلة. هل هناك أي شيء آخر يتعين علي القيام به لبدء عملية مراجعة طلب السحب المشار إليه؟

شكر!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

gkiely picture gkiely  ·  3تعليقات

bdedardel picture bdedardel  ·  3تعليقات

bfis picture bfis  ·  3تعليقات

6pm picture 6pm  ·  3تعليقات

robertleeplummerjr picture robertleeplummerjr  ·  3تعليقات