首页 > 在node中,在不同的模块中的相同模块是否会重复加载?

在node中,在不同的模块中的相同模块是否会重复加载?

如题,
如果现在有如下的模块

如果在B中引用了C这个模块,那么在D时,引用C这个模块会引用B下的缓存还是重新引用D下面的C?

另外require是根据什么来判断是否从文件加载还是从缓存加载?


好问题,看了下文档:Cycles, Conflicts, and Folder Parsimony

参考这一节文档:caching,可以看到如下内容:

Modules are cached after the first time they are loaded. This means (among other things) that every call to require('foo') will get exactly the same object returned, if it would resolve to the same file.

最后一句话,有没有帮助到你?


昨天刚好看了@朴灵大大《node.js深入浅出》关于模块加载这部分,针对你的问题回答如下:

Node中引入模块,需要经历3个步骤:(1)路径分析,(2)文件定位,(3)编译执行

为了减少二次引用时的开销,Node对引入过的模块都会进行缓存,缓存的是编译和执行后的对象

不论是核心模块还是文件模块,require()方法对相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的。

那么“require是根据什么来判断是否从文件加载还是从缓存加载?”

每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache对象上,以提高二次引入的性能。

所以通过require引入一个模块时,Node会先去检查缓存中有没有,即检查Module._cache对象里是否有要引入模块的文件路径,有,则从缓存加载,没有则从文件加载。

从而,在不同路径下的同一个模块会被Node认为是不同的模块。

ps.这本书真的很不错,推荐看看~ 模块加载这部分在p15-p20

【热门文章】
【热门文章】