Узел-модуль выгружен, но все еще доступен - PullRequest
0 голосов
/ 16 июня 2019

Я хочу полностью выгрузить узел-модуль.

Это для системы плагинов узлов, которая автоматически загружает некоторые модули.Чтобы проверить наличие каждого необходимого свойства, я загружаю и выгружаю модуль, так как мне нужно запустить его как child_process (чтобы разблокировать мое основное приложение).Я нашел несколько ответов, ведущих в этом направлении, но ни один из них не помог мне.

loader.js

const pluginPath = "./path-to-my/index.js";
const plugin = require(path.resolve(pluginPath));

// Performing my testing 

// delete require.cache[pluginPath]; // first try
unloader()(path.resolve(pluginPath)); // does the same but to child modules too 
// see unloader.js

unloader.js

module.exports = () => {
  const d = [];
  const isDone = m => (d.indexOf(m) !== -1);
  const done = m => d.push(m);

  return (name) => {
    let resolvedName = require.resolve(name);

    if ((!isDone(resolvedName) && !isDone(name))) {
      let nodeModule = require.cache[resolvedName];

      done(resolvedName);
      done(name); 
      if (nodeModule) {
        for (let i = 0; i < nodeModule.children.length; i++) {
          let child = nodeModule.children[i];
          deleteModule(child.filename);
        }
        delete require.cache[resolvedName];
      }
    }
  }
}

после выполнения этоговыгрузка Я все еще могу вызвать plugin.func1 () - глупая функция, возвращающая 1.

1 Ответ

0 голосов
/ 16 июня 2019

Вы удаляете ссылку из require.cache [moduleName], но ссылка на модуль все еще существует как plugin в вашем основном скрипте. Если вы отмените его (plugin = null), и никаких других ссылок не останется, он должен быть в конечном итоге собран мусором.

...