模块的加载机制
模块在第一次加载后会被缓存
。这意味着多次调用require()不会导致模块的代码被执行多次。
内置模块、用户自定义模块、第三方模块,它们都会优先从缓存加载,从而提高模块的加载效率。
1.内置模块的加载机制
内置模块的加载优先级
最高。
例如:
即使在node_modules目录下有名字相同的包也叫fs, require('fs')始终返回内置的fs模块
2.自定义模块的加载机制
使用require()
加载自定义模块,必须指定以./
或../
开头的路径标识。如果没有路径标识,则node会把它当作内置模块或第三方模块进行加载。
如果省略了文件的扩展名,则node.js会按顺序尝试加载以下文件:
1.按照确切的文件名进行加载
2.补全.js扩展名进行加载
3.补全.json扩展名进行加载
4.补全.node扩展名进行加载
- 最后都没找到的话就加载失败,终端报错
3.第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块,也不是以./
或../
开头,则Node.js会从当前模块的父目录开始,尝试从node/modules
文件夹加载第三方模块。
如果没有,则上一层目录逐级查找进行加载,直到找到根目录。
目录作为模块的情况
当require(目录)
的时候,加载方式为:
1.先去被加载目录找到package.json的文件,找到main属性,作为require()加载入口。
2.如果没有package.json或者main不存在或无法解析,Node.js会试图加载目录下的index.js文件
3.如果还是没有,就报错