优先从缓存中加载
-
当一个模块初次被
require
的时候,会执行模块中的代码,当第二次加载相同模块的时候,会优先从缓存中查找,看有没有这样的一个模块! -
好处:提高模块的加载速度;不需要每次都重新执行并加载模块!
-
先查找缓存;如果缓存中没有,再去加载核心模块;
用户模块的加载机制
-
-
如果缓存中没有则尝试加载用户模块;
-
如果在加载用户模块时候省略了后缀名,则:
首先,严格按照指定的名称去查找
其次,尝试加载后缀名是 .js 的文件
如果没有.js的文件,则尝试加载 .json 结尾的文件
如果没有 .json 的文件,则尝试加载 .node 结尾的文件
查找规则:index -> index.js -> index.json -> index.node
第三方模块的加载机制
-
先在当前模块的父目录中,查找
node_modules
文件夹 -
在
node_modules
文件夹下,查找模块相关的文件夹 -
在对应的文件夹下,查找
package.json
的文件 -
查找
package.json
文件中的main
属性(指定了模块的入口文件) -
如果找到了
main
属性,同时,main
属性指定的文件路径存在,那么尝试加载main
属性指向的模块,直到加载成功为止; -
假如
main
属性指向的文件不存在,则直接报错:Error:Cannot find module ***
-
假如没有
main
属性,或者没有package.json
,那么会依次尝试加载index.js
,index.json
,index.node
; -
如果没有
index
相关的文件,或node_modules
中,没有模块名称对应的文件夹,或者,当前项目根目录中没有node_modules
文件夹,则向上一层目录中查找node_modules
,查找规则同上! -
最后,如果在项目所在磁盘的盘符根目录中,还找不到对应模块,则报错:
cannot find module ***