在node中模块中,上下文提供require()方法来引入外部模块:
var test=require('./index.js');
在require中传入模块标识,其实就是参数,可以 . 、 .. 开头的相对路径,或者绝对路径,也可以是文件夹。
在node中,模块分为两类:一类是node提供的模块,为核心模块,另一类是用户编写的模块,为文件模块。
在node中引入模块,需要经历三个过程:
1.路径分析
2.文件定位
3.编译执行
核心模块加载只需要经历路径分析,因为在node进程启动的时候,部分核心模块已经加载进内存中。
node中也有缓存加载,node对引用过的模块都会进行缓存,浏览器缓存的是文件,node缓存的是编译和执行后的对象;
在缓存加载机制中,核心模块缓存最先加载,文件模块缓存低于核心模块加载。
文件定位
require在分析标识符中,会出现不包含文件扩展名的情况,这种情况node会按js、json、node的次序补充扩展名,依次尝试。如果尝试没有获取到相对应的文件,却得到一个目录,node也会把这个目录当成一个包来处理。
看下图:require加载文件模块zhang,但是没有指明是zhang文件模块下那个模块。默认是index.js、index.json、index.node
node在目录分析中没有定义成功任何文件,则会进入下一个模块路径进行查找,全部查找完毕木有,则会抛出错误
缓存加载<--核心模块缓存<--文件模块缓存<--核心模块加载<--文件模块加载<--详细路径<--简单目录