require() 源码解读

x33g5p2x  于2022-03-14 转载在 其他  
字(0.7k)|赞(0)|评价(0)|浏览(465)

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

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

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

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

(3)、如果x不带路径

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

(4)、抛出 ' not found '
二、Module构造函数

如上图所示,为node中定义Module的源码,其中存在一些属性,我们所有的模块都是Module的实例,接下来我们打印出,一个模块中的值。

此时我们定义一个b.js模块,并且在其中引入a.js模块。此时执行b.js打印出来的结果为:

三、模块实例的require方法
从上面的源码中我们知道每一个模块保存的信息,然后我们再进一步看一下加载模块的具体内部流程步骤。

从上面源码可以看出,require在每一个实例对象上都存在,然后执行返回Module._load的结果。

如上图所示,为Module._load的部分源码部分,加注释的为主要的步骤。

如上所示流程图。
从上述代码可以看出,

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

相关文章