模块

模块加载流程

在Node中引入模块,需要经历如下3个步骤
1.路径分析
2.文件定位
3.编译执行

模块种类

在Node中,模块分为两类,一类是Node提供的模块,称为核心模块,一类是用户编写的,称为文件模块
核心模块在Node源码编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载到了内存中,所以在引入时,文件定位和编译执行的步骤省略了,并在路径分析时优先判断,所以速度快
文件模块则是动态加载的,需要完整的路径分析、文件定位、编译执行过程,速度比加载核心模块要慢

模块缓存

Node对于引入过的模块都会进行缓存,以减少二次引入时的开销,且缓存的是编译和执行之后的对象,不论是哪种模块,require()对相同模块的二次加载都一律采用缓存优先的方式,核心模块缓存检查优先文件模块

路径分析和文件定位

require接收一个标识符作为参数,标识符主要分为一下几类:
1 核心模块,如http、fs、path
2 .或..开始的相对路径文件模块
3 以/开始的绝对路径文件模块
4 非路径形式的文件模块,如自定义的模块(如node_modules中的,查找速度最慢)

自定义模块

node_modules中的都是自定义模块
自定义模块的引入会沿着当前目录逐级向上层找node_modules,有点类似原型链查找,所以路径越深,查找模块越耗时
// [
//     'e:\\nodejs\\node_modules',
//     'e:\\node_modules'
// ]
module.paths

文件扩展名分析

require在分析标识符的过程中,若无扩展名,会按照.js .json .node次序补足,依次尝试

目录和包分析

在分析标识符过程中,require通过分析文件扩展名之后,可能没有查找到对应文件,但却得到一个目录,此时会当做包来处理。
1.首先查找package.json中的main属性,对指定文件名进行定位,若缺少文件名,则进入扩展名分析,若main中指定的文件若无,或压根就没有package.json文件,Node会将index当做默认文件名
2..然后依次查找index.js index.json index.node,若还是没有定位到文件,则进入下一个模块路径查找,若最终依然没有查找到目标文件,抛出异常
posted @ 2021-12-25 21:54  邢韬  阅读(55)  评论(0编辑  收藏  举报