Можно ли использовать потребление данных, когда модули могут быть удалены, чтобы сохранить память

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

Вопрос

Мы разрабатываем приложение в встроенной среде. Это среда высокоуровневой вычислительной среды с полным веб -образованием в верхней части системы 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(); } );

Другие советы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top