优先从缓存中加载
模块在第一次加载后会被缓存。这也意味着多次调用 require() 不会导致模块的代码被执行多次
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率
$就像下方图中测试
内置模块加载优先级
内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高
例如,require(fs)始终返回内置的 fs 模块,即使在 node modules 目录下有名字相同的包也叫做 fs.
自定义模块的加载顺序
使用 require() 加载自定义模块时,必须指定以./或 …/开头的路径标识符。在加载自定义模块时,如果没有指定./或 …这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。
同时,在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下后缀的文件:
.txt < .js < .json < .node
第三方模块的加载机制
在使用require时不加./ 或 …/时优先加载内置模块,然后是第三方模块,它还会从当前目录下查找是否有node_modules文件夹,如果有就引用,如果没有就继续往上级目录查找,类似于事件冒泡
目录做为模块
当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式:
- 在被载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性,作为 require()加载的入口
- 如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则Node.js 将会试图加载目录下的 index.js文件
- 如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失: Error: Cannot find module 'xxx
END