[TOC]
# 在 node 中,在不同的模块中的相同模块是否会重复加载?
如题,
如果现在有如下的模块
```
*—A
*—B
*—C
*—D
*—C
```
如果在 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
[Node.js 模块系统(Node.js 自学第四天)](https://juejin.im/post/5ddb6a3251882572fe6edf61)