Подтвердить что ты не робот

Разгрузка кода/модулей

Мне интересно, есть ли хороший способ выгрузить модуль после его использования. У меня есть некоторые случаи, когда мне нужно использовать модули, которые приносят много кода, но они используются редко (скажем, как инструмент администратора), но я не решаюсь использовать их, потому что впоследствии они, по-видимому, просто теряют память, которая может быть лучше используется в другом месте. Есть ли способ их выгрузить, либо явно, либо разрешить системе делать это, когда они не использовались какое-то время?

4b9b3361

Ответ 1

Да, доступ к кешу модуля можно получить напрямую:

var name = require.resolve('moduleName');
delete require.cache[name];

Обратите внимание, что если ваш код содержит ссылку на все, что было обнаружено этими модулями, от которых вы хотите избавиться, оно не будет очищено.

(В стороне: под поверхностью require.resolve и require.cache являются прокси-серверами соответственно Module._resolveFilename и Module._cache, причем Module является загрузчиком основного модуля, то есть require('module').)

Ответ 2

Вы можете сделать что-то вроде этого, чтобы "выгрузить" модуль node:

/**
 * Deletes a node module and all associated children
 * from node require cache
 * @param {string} moduleName The name of the module or 
 *                            absolute/relative path to it
 */
function deleteModule(moduleName) {
  var solvedName = require.resolve(moduleName),
    nodeModule = require.cache[solvedName];
  if (nodeModule) {
    for (var i = 0; i < nodeModule.children.length; i++) {
      var child = nodeModule.children[i];
      deleteModule(child.filename);
    }
    delete require.cache[solvedName];
  }
}

"Выгрузка" a node означает, что вы "удаляете" свою запись из node требуемого кеша. Фрагмент выше транзитивно удаляет один модуль node из кеша и всех связанных модулей (дочерние модули).

В моем случае я требовал "index.js" , который в то же время требовал "/lib/.js" . Я хотел протестировать инициализацию "index.js" (и, следовательно, там нужен только другой модуль, который был /lib/.js). Удаление "index.js" из кеша было недостаточным, поскольку в кеше содержалась отдельная ссылка на "/lib/.js" , и это привело к тому, что модуль "/lib/.js" не был снова загружен из его файла.

Вышеупомянутый код может, конечно, удалить из кеша другие модули, от которых зависит этот модуль (это на самом деле то, что я хотел, но вы можете не захотеть делать это для других модулей, таких как "fs", "path" или даже "underscore" ),

Вы всегда можете расширить этот метод, чтобы принять список модулей, которые вы не хотите удалять, или фильтр, который вы могли бы применить к "пути" разрешенного модуля. Вы можете сказать: не удалять основные модули node (список основных имен модулей node доступен как пакет npm: https://www.npmjs.com/package/node-core-module-names) или не удалять ни один из пакетов под node_modules и т.д. и т.д. Это может быть фильтр внутри функции, но он имеет ту же логику.