node.js-卸载代码/模块

我很好奇在使用模块后是否有任何好的方法可以卸载模块。 在某些情况下,我需要使用引入大量代码的模块,但是很少使用它们(例如作为管理工具),但我犹豫使用它们,因为在此之后它们可能只会浪费内存,而这可能会更好 在其他地方使用。 是否有任何方法可以明确地卸载它们,或者在一段时间不使用它们时允许系统卸载它们?

rob asked 2020-02-11T08:48:48Z
2个解决方案
72 votes

是的,可以直接访问模块缓存:

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

请注意,如果您的代码中包含对您想摆脱的这些模块公开的内容的引用,则不会对其进行清理。

(顺便说一句:在表面下方,Module._cache7和Module._cache7分别是Module._resolveFilenameModule._cache715的代理,其中Module._cache716是核心模块加载程序,即Module._cache717。)

chjj answered 2020-02-11T08:49:21Z
4 votes

您可以执行以下操作来“卸载”节点模块:

/**
 * 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];
  }
}

“卸载”节点模块意味着您正在从节点“删除”其条目需要缓存。 上面的代码片段从缓存中删除了一个节点模块以及所有关联的模块(子模块)。

在我的情况下,我需要“ index.js”,同时又需要“ /lib/.js”。 我想测试“ index.js”的初始化(因此,唯一需要的其他模块是/lib/.js)。 从缓存中删除“ index.js”是不够的,因为缓存维护了对“ /lib/.js”的单独引用,这导致模块“ /lib/.js”无法从其文件中再次加载。

上面的代码肯定可以从缓存中删除该模块所依赖的其他模块(实际上,这是我想要的,但您可能不想对其他模块(例如“ fs”,“ path”甚至“ underscore”)执行此操作)。

您始终可以扩展此方法,以接受您不想删除的模块列表或可以应用于已解析模块的“路径”的过滤器。 您可以说:不要删除核心节点模块(核心节点模块名称列表可作为npm软件包提供:[https://www.npmjs.com/package/node-core-module-names)]或don 请勿删除node_modules等下的任何软件包。这可能是函数内部的过滤器,但逻辑相同。

Christian Adam answered 2020-02-11T08:50:01Z
translate from https://stackoverflow.com:/questions/6676612/unloading-code-modules