卸载代码/模块

我很好奇在使用它之后是否有任何好的方法来卸载模块。 我有一些需要使用模块的例子,但是很less使用(比如说pipe理工具),但是我不愿意使用它们,因为之后他们可能会浪费内存,这可能会更好在别处使用。 有没有什么办法可以卸载它们,要么是明确的,要么是在系统没有使用一段时间的情况下让系统去卸载它们?

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

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

请注意,如果您的代码提供了您想要摆脱的这些模块所暴露的内容的引用,则不会被清除。

require.resolve :在表面之下, require.resolverequire.cache分别是require.resolverequire.cache的代理, Module是核心模块加载器,即require('module')

你可以做这样的事情来“卸载”一个节点模块:

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

“卸载”一个节点模块意味着你正在从节点requirecaching中“删除”它的入口。 上面的代码片段从caching和所有相关的模块(子模块)中过渡地删除了一个节点模块。

在我的情况下,我需要“index.js”,在同一时间,需要“/lib/.js”。 我想testing“index.js”的初始化(因此在那里是唯一需要的其他模块是/lib/.js)。 从caching中删除“index.js”是不够的,因为caching保留了对“/lib/.js”的单独引用,并导致模块“/lib/.js”不能再从其文件中加载。

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

您始终可以扩展此方法以接受您不想删除的模块的列表,或者可以应用到已parsing模块的“path”的筛选器。 您可以这样说:不要删除核心节点模块(核心节点模块名称的列表可用作npm包: https ://www.npmjs.com/package/node-core-module-names)或者不要删除node_modules下的任何包等等。这可能是函数内部的一个filter,但它是相同的逻辑。