5.node中的模块加载规则

1.模块加载顺序
  1. 从缓存中加载
  2. 核心模块
  3. 路径形式的文件模块
  4. 第三方模块

分析:

优先级1:

从缓存中加载模块

node在执行程序时,会将引入的模块存入缓存中,方便下次引用时直接从缓存中读取,而不需要重新引用,这样做可以加快程序执行速度,减少不必要的时间浪费

所以当我们加载模块时,node会优先从缓存中寻找指定模块

优先级2:

加载核心模块

node为我们准备了一些核心模块,例如文件模块fs,网络模块http等,当我们引入模块时,node会优先加载这些文件

require('fs')

优先级3:

加载以路径形式引入的文件模块

加载我们定义的文件,文件一般用相对路径引入

require('./a.js')

优先级4:

加载第三方模块

require('a')

第三方模块指的是我们通过npm或者其他方式下载的含有特定功能的库,这些库存在于node_modules文件夹中,node通过寻找node_modules中的模块来进行引入


第三方模块的引入顺序

当我们引入一个第三方库时,node会将这个含有第三方库的·文件夹存储在node_modules文件夹中(如果没有node_modules文件夹则自动创建),第三方库的文件夹含有一个package.json文件,文件内的main可以指定这个库的入口文件,当我们引入第三方库实际上就是引用这个入口文件

package.json

package.json可以指定模块的入口文件,如果不指定main或者模块中没有package.json文件,node会寻找这个库中名为index.js的文件作为这个模块的入口文件

{
    "main":"index.js",//如果指定为index.js,则入口文件为index.js,如果为a.js,则入口文件为a.js
    ....
}

index.js

/*这个第三方库所含有的方法、属性等等...*/

另外,当与我们同级目录中的node_modules没有找到我们引入的模块时,node会向上一级目录的node_modules文件夹中寻找(寻找规则与前者相同),直到找到我们需要的模块.

如果寻找到项目的根目录仍然没有找到我们需要的模块,则控制台报错:can't found module xxx


我们手动模拟一下第三方模块的引入过程

我们创建一个test.js文件,用来引入模块

test.js

require('a')

a模块,作为我们创建的第三方模块

a模块:文件结构为

---index.js

---package.json

index.js

console.log("a模块的index被加载了");

package.json

{
    "main":"index.js"
}

执行test.js

控制台输出以下结果

node_modules cdn方案 node模块加载原则_html5

以上的引入过程

1.从test.js同级目录下寻找node_modules目录

2.然后寻找名为a的模块目录,

3.找到之后寻找a中的package.json文件中main指定的入口文件index.js

最终成功引入模板,也就是index.js