require 源码解读

时间:2024-11-16 18:16:49

一、require的基本用法
Node遇到require(X)时,按下面的顺序处理。
(1)、如果X是内置模块(比如说 require(X))

返回该模块,不再继续执行。
  • 1

(2)、如果X以‘./’, 或者 ‘ / ’,或者'../'开头

根据x所在的父模块,确定x的绝对路径。
将x当成文件,依次查找下面的文件,只要其中有一个存在,就返回该文件,不再继续执行。
x
x.js
x.json
x.node
如果上述文件都不存在,则将x当做目录,依次查找下面的文件。
x/package.json
x/index.js
x/index.json
x/node
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(3)、如果x不带路径

根据x所在的父模块,确定x可能的安装目录
依次在每一个目录中,将x当做文件名或者目录名进行加载。
  • 1
  • 2

(4)、抛出 ' not found '
二、Module构造函数
在这里插入图片描述
如上图所示,为node中定义Module源码,其中存在一些属性,我们所有的模块都是Module的实例,接下来我们打印出,一个模块中的值。
在这里插入图片描述
此时我们定义一个模块,并且在其中引入模块。此时执行打印出来的结果为:
在这里插入图片描述
三、模块实例的require方法
从上面的源码中我们知道每一个模块保存的信息,然后我们再进一步看一下加载模块的具体内部流程步骤。
在这里插入图片描述
从上面源码可以看出,require在每一个实例对象上都存在,然后执行返回Module._load的结果。
在这里插入图片描述
如上图所示,为Module._load的部分源码部分,加注释的为主要的步骤。
在这里插入图片描述
如上所示流程图。
从上述代码可以看出,

Module._resolveFilename:获取模块的绝对路劲
module.load():加载模块
  • 1
  • 2