Node.js如何使用require()多次处理大型数组和对象?

时间:2015-07-31 08:48:16

标签: javascript node.js caching

在我的项目中,我间接使用了一些大数据 - 在我的具体情况下,这些是Minecraft块和项目信息。

正如我所说,我间接使用数据 - 我的一个依赖项使用它。但现在我也想使用它,这意味着我需要require()包含所有数据的.js文件。由于javascript中没有常量,并且加载的对象是可变的,我的问题是它是否真的会在Node的内存中加载两次。如果是,我该怎么做才能节省内存?

2 个答案:

答案 0 :(得分:2)

https://nodejs.org/docs/latest/api/modules.html#modules_caching

  

模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require('foo')将获得完全相同的返回对象,如果它将解析为同一个文件。

因此,如果您的依赖项位于项目中,并且require是您想要require的相同文件,它将返回相同的对象。但是如果您的依赖关系A是一个节点模块,它需要依赖关系B(大数组)作为一个单独的节点模块......并且您将B添加为整个项目的依赖关系,它将解析为另一个文件。这意味着它将是一个不同的对象。

  

模块根据其解析的文件名进行缓存。由于模块可能会根据调用模块的位置(从node_modules文件夹加载)解析为不同的文件名,因此不能保证require('foo')将始终返回完全相同的对象,如果它将解析为不同的文件

答案 1 :(得分:1)

当你需要两次相同的文件时,它只会加载到内存中一次,你只需要获得两次引用。数据通常也是可变的,所以如果一个地方修改了它,那么 看到那个变化(这会导致一些令人困惑的错误!)。您可以通过使用不可变数据结构(如immutable.js中的那些)或使用Object.freeze来避免这种情况(但请注意,这只是浅不变性,所以如果对象的任何键本身都是可变对象,它们将会保持如此)。