Node.js理论部分的主要学习材料是朴灵的《深入浅出的Node.js》
Node.js为了实现文件间的相互调用,引入了模块系统(采用CommonJS规范)。模块是Node.js应用程序的基本组成部分,文件与模块是一一对应的。
分类
Node.js中的模块分为两大类,一类是核心模块,一类是文件模块,文件模块又分为路径形式的模块和自定义模块:
1. 核心模块
核心模块是由Node提供的模块。
在Node进程启动时,部分核心模块直接被加载在进内存,省略文件定位和编译执行两个步骤,并且在路径分析中优先判断,所以它的加载速度是最快的。
2. 文件模块(路径形式模块)
文件模块是用户编写的模块,引入时通过文件路径引入。
在分析文件模块时,require()方法会及那个路径转为真是路径,并以真实路径为索引,将编译执行后的结果存放在缓存中,以便二次加载时更快。
因为文件模块给Node指明了文件路径,所以查找过程节省了大量时间,其加载速度仍慢于核心模块加载速度。
3. 自定义模块
自定义模块指的是非核心模块,也不是以路径形式作为标识符的文件模块,可能是文件或包的形式。
自定义模块的查找是最费时间,也是所有方式中最慢的。
自定义模块查找策略
Node.js在查找自定义模块时,会先从当前目录的node_modules文件夹开始查找;如果没有,则向父目录的node_modules查找;如果没有,则继续向上一级查找,直到根目录的node_modules目录。
CommonJS模块规范
CommonJS对模块的定义主要分为模块引用
、模块定义
、模块标志
三个部分。
模块引用
通过require()方法引用模块。
// 核心模块
const http = require('http');
// 文件模块
const testjs = require('./test.js');
模块定义
在模块中,提供了exports
对象用于导出当前模块或变量。
// test.js
exports.test1 = function () {
return 'haha'
}
module.exports.test2 = function () {
return 'hehe'
}
/**
exports vs module.exports
exports是module.exports的引用,如果给module.export赋值,则会切断与exports的联系。
*/
模块标识
模块标识,就是传递给require()方法的参数,可以是符合驼峰命名的字符串、.
或..
开头的相对路径,或者绝对路径。