Node.js 是否可以在nodejs中释放所需的模块?

Node.js 是否可以在nodejs中释放所需的模块?,node.js,Node.js,在nodejs中导入文件时,会加载、计算和缓存该文件 如果你知道你永远不会再使用它(或者在很长一段时间内,值得再次编译它),是否有可能释放该文件的内存 我想做的是导入一个临时文件,读取它的代码,执行一次,然后永远释放它(我知道它不会被再次使用,我不想内存泄漏) 基本上是在nodejs中有动态代码 这样的页面允许您输入代码并在后端执行,应该使用类似的解决方案。。。除非他们使用该代码运行一个全新的nodejs实例。。。然后杀了它 可能吗?如果是,怎么做?好的,阅读,它碰巧存在一个公共缓存成员,它说:

在nodejs中导入文件时,会加载、计算和缓存该文件

如果你知道你永远不会再使用它(或者在很长一段时间内,值得再次编译它),是否有可能释放该文件的内存

我想做的是导入一个临时文件,读取它的代码,执行一次,然后永远释放它(我知道它不会被再次使用,我不想内存泄漏)

基本上是在nodejs中有动态代码

这样的页面允许您输入代码并在后端执行,应该使用类似的解决方案。。。除非他们使用该代码运行一个全新的nodejs实例。。。然后杀了它

可能吗?如果是,怎么做?

好的,阅读,它碰巧存在一个公共
缓存
成员,它说:

模块在需要时缓存在此对象中。通过从此对象中删除键值,下一个请求将重新加载模块。这不适用于本机插件,重新加载将导致错误

也可以添加或替换条目。在本机模块之前检查此缓存,如果将与本机模块匹配的名称添加到缓存中,则不再需要调用来接收本机模块。小心使用

因此,我猜每个被评估的模块都在内部,从这个对象中删除一个键,就像文档中所说的那样,它还将释放代码部分的相关内存(当垃圾收集器完成其工作时)

好的,读取时,它恰好存在一个公共
缓存成员,并且它说:

模块在需要时缓存在此对象中。通过从此对象中删除键值,下一个请求将重新加载模块。这不适用于本机插件,重新加载将导致错误

也可以添加或替换条目。在本机模块之前检查此缓存,如果将与本机模块匹配的名称添加到缓存中,则不再需要调用来接收本机模块。小心使用


因此,我猜每个被评估的模块都在内部,从这个对象中删除一个键,就像文档中说的那样,它还将释放代码部分的相关内存(当垃圾收集器完成其工作时)

您可以像这样从模块缓存中删除。只需确保没有循环依赖项,否则模块实际上不会从内存中释放

delete require.cache[require.resolve('./theModuleYouWantToDelete.js')]

您可以像这样从模块缓存中删除。只需确保没有循环依赖项,否则模块实际上不会从内存中释放

delete require.cache[require.resolve('./theModuleYouWantToDelete.js')]

这取决于你所说的“免费”模块是什么意思。Nodejs无法在代码运行后删除代码,因此代码将始终保留在内存中

如果删除对模块的所有引用(通过从缓存中删除它)并删除对导出数据的任何其他引用,则与模块关联的任何数据都应符合垃圾收集的条件


对于一个允许用户在服务器上运行任意代码的服务,我总是在一个单独的沙盒进程中运行该服务,您可以终止该进程并恢复代码使用的所有资源,而不是在主服务器进程中运行该服务。

这取决于您所说的“释放”模块是什么意思。Nodejs无法在代码运行后删除代码,因此代码将始终保留在内存中

如果删除对模块的所有引用(通过从缓存中删除它)并删除对导出数据的任何其他引用,则与模块关联的任何数据都应符合垃圾收集的条件


对于一个允许用户在服务器上运行任意代码的服务,我总是在一个单独的沙盒进程中运行该服务,您可以终止该进程并恢复代码使用的所有资源,而不是在主服务器进程中运行该服务。

正是我刚才发现的!但是谢谢你的代码块我刚刚发现的东西真灵巧!但是谢谢你的代码块除了其他模块之外,还有什么方法可以导入模块?释放他们too@danikaze-我不知道那个评论是什么意思。如果我包括模块A,但A包括B,有没有办法知道B也包括在内?如果没有,可能即使我释放了模块A,我也无法正确地释放B(因为我不知道它的存在)@danikaze-不。正如我试图向你指出的,试图“释放”模块的整个概念从一开始就是一个错误的设计。它不是nodejs设计的一部分。在一个单独的进程中运行这些,您可以关闭该进程来清理所有内容。是的,很抱歉问==导入模块的任何方法,但是否还有其他模块?释放他们too@danikaze-我不知道那个评论是什么意思。如果我包括模块A,但A包括B,有没有办法知道B也包括在内?如果没有,可能即使我释放了模块A,我也无法正确地释放B(因为我不知道它的存在)@danikaze-不。正如我试图向你指出的,试图“释放”模块的整个概念从一开始就是一个错误的设计。它不是nodejs设计的一部分。在一个单独的进程中运行这些,您可以关闭该进程来清理所有内容。是的,很抱歉这么问=_=