5.node中的模块加载规则
1.模块加载顺序
- 从缓存中加载
- 核心模块
- 路径形式的文件模块
- 第三方模块
分析:
优先级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
控制台输出以下结果
以上的引入过程
1.从test.js同级目录下寻找node_modules目录
2.然后寻找名为a的模块目录,
3.找到之后寻找a中的package.json文件中main指定的入口文件index.js
最终成功引入模板,也就是index.js