一、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