Можно ли использовать потребление данных, когда модули могут быть удалены, чтобы сохранить память
-
02-10-2019 - |
Вопрос
Мы разрабатываем приложение в встроенной среде. Это среда высокоуровневой вычислительной среды с полным веб -образованием в верхней части системы Busybox Linux. Единственным исключением является то, что система имеет ограниченное количество системной памяти.
Наше приложение встроено в JavaScript и работает внутри WebBrowser на основе WebKit и состоит из множества модулей JavaScript, которые загружаются в последовательности (что не очень эффективно).
Некоторые модули обеспечивают общую функциональность, которая используется несколькими модулями. Мы находимся в процессе преобразования нашего текущего загрузчика JavaScript с помощью требований, но есть одна конкретная потребность, которую мы должны сначала решить.
Можно ли разгрузить модуль, когда он был загружен с использованием EMENJS? Предположим, что мы динамически загружаем модуль, используя:
require(["somemodule.js"], function(m) { m.run(); } );
Это хорошо работает для загрузки и бега «сомемодоула», а также также разрешение всех зависимостей для «SomeModule» и Frameworks Frameworks хранит ссылку на «SomeModule» для будущих запросов.
Если мы в какой-то момент нам нужно восстановить память, например, чтобы иметь возможность загрузить и запустить бесконечное количество модулей, мы должны начать удалять некоторые из них через некоторое время. Это возможно с требованиями, не изменяя внутреннюю реализацию?
Кто-нибудь имел дело с такими проблемами раньше? Большинство приложений JS WebBrowser запускаются в WebBrowser на настольном ПК, где использование памяти обычно не является серьезной проблемой.
Решение
TIQUES не имеет встроенной функции разгрузки, но она может быть добавлена, возможно, в качестве дополнительной части, которую вы можете встроить в нее. Если вы хотите иметь эту функцию, не стесняйтесь предложить это в список рассылки или как а Выпуск GitHub.
Если вы хотели экспериментировать, чтобы увидеть, поможет ли это вашу ситуацию, что вам нужно сделать, это следующее:
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») внутри определения функции, когда вы хотите получить удержание зависимых модулей, и не удерживайте его требуемый возврат ценить слишком долго.
Кроме того, в вашем примере выше, для модулей, которые используют требуемый .DEF, чтобы определить себя, он должен выглядеть так (без суффикса .js):
require(["somemodule"], function(m) { m.run(); } );
Другие советы
Попробуй это: require.undef (модуль пользователя)