هل من الممكن استخدام المتطلبات عندما يتعين إزالة الوحدات النمطية للحفاظ على الذاكرة

StackOverflow https://stackoverflow.com/questions/3164049

سؤال

نقوم بتطوير تطبيق في بيئة مضمنة. إنها بيئة حوسبة عالية المستوى مع جهاز WebBrowser كامل أعلى نظام Linux Busybox. الاستثناء الوحيد هو أن النظام لديه كمية محدودة من ذاكرة النظام.

تم تصميم تطبيقنا في JavaScript ويعمل داخل WebBrowser على الويب ويتكون من الكثير من وحدات JavaScript التي يتم تحميلها بالتسلسل (وهو غير فعال للغاية).

توفر بعض الوحدات وظائف شائعة تستخدمها عدة وحدات. نحن بصدد تحويل محمل JavaScript الحالي الخاص بنا مع متطلبات ، ولكن هناك حاجة واحدة محددة يجب أن نتصدىها أولاً.

هل من الممكن تفريغ وحدة نمطية عند تحميلها باستخدام requirejs؟ افترض أننا نقوم بتحميل وحدة نمطية باستخدام:

require(["somemodule.js"], function(m) { m.run(); } );

يعمل هذا بشكل جيد لتحميل وتشغيل "SomeModule" وكذلك حل جميع التبعيات لـ "Somemodule" وإطار مطلواني SerqueJS سيخزن إشارة إلى "Somemodule" للطلبات المستقبلية.

إذا احتجنا في مرحلة ما إلى استعادة الذاكرة ، على سبيل المثال لتكون قادرًا على تحميل وتشغيل عدد لا حصر له من الوحدات النمطية ، علينا أن نبدأ في إزالة بعضها بعد بعض الوقت. هل هذا ممكن مع المتطلبات دون تغيير التنفيذ الداخلي؟

هل تعامل أي شخص مع هذا النوع من المشكلات من قبل؟ تعمل معظم تطبيقات JS ذات الصفحات الواحدة في جهاز WebBrowser على جهاز كمبيوتر سطح المكتب حيث لا يمثل استخدام الذاكرة عادةً مصدر قلق كبير.

هل كانت مفيدة؟

المحلول

لا يحتوي requistjs على ميزة تفريغ مدمجة ، ولكن يمكن إضافتها ربما كجزء إضافي يمكنك أن تبنيه. إذا كنت ترغب في الحصول على هذه الميزة ، فلا تتردد في اقتراحها القائمة البريدية أو ك قضية جيثب.

إذا كنت ترغب في التجربة لمعرفة ما إذا كان يساعد وضعك ، فإن ما عليك فعله هو ما يلي:

1) قم بإزالة الوحدة النمطية المحددة من ذاكرة التخزين المؤقت للوحدة. إذا كنت لا تستخدم دعم Multiversion ، فيمكنك القيام بشيء مثل:

var context = require.s.contexts['_'];
delete context.defined[moduleName];
delete context.specified[moduleName];
delete context.loaded[moduleName];

2) ثم يمكنك محاولة إزالة علامة البرنامج النصي لمعرفة ما إذا كان ذلك يساعد:

var scripts = document.getElementsByTagName('script');
for (var i = scripts.length - 1; i >= 0; i--) {
    var script = scripts[i];
    if (script.getAttribute('data-requiremodule') === moduleName) {
        script.parentNode.removeChild(script);
        break;
    }
}

لاحظ أنه قد لا يتم جمع الوحدة النمطية إذا تمسكت وحدة أخرى بها عبر وظيفة الإغلاق () {} التي تحدد تلك الوحدة الأخرى. هذه الوحدة الأخرى ستحتاج إلى إزالتها أيضًا.

يمكنك محاولة الحد من هذا التأثير من خلال عدم تمرير الوحدة النمطية كوسيطة للوظيفة ، ولكن فقط الاستخدام يتطلب ("somemodule") داخل تعريف الوظيفة كلما أردت الحصول على وحدات تابعة ، وعدم التمسك بذلك تتطلب العودة إلى ذلك القيمة لفترة طويلة.

أيضًا ، في مثالك أعلاه ، بالنسبة للوحدات النمطية التي تستخدم متطلبات.

require(["somemodule"], function(m) { m.run(); } );

نصائح أخرى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top