Node基于commonJS规范实现模块引用机制
1、模块定义:
一个文件一个模块,module.exports.funcName定义当前模块对外可用的function
示例:test.js文件
function testFunc(info){
return "info:"+info;
}
module.exports.t = testFunc;
index.js
let m = require('./test');//index.js test.js同一文件夹
console.error(m.t("node模块学习"));
2、模块引用:用require('模块标识符'),将模块的api引入到当前上下文中
示例: let math require('math');
3、require引用模块三步骤:
1)、路径分析
2)、文件定位
3)、编译执行:编译成功后的模块会将其文件路径作为索引缓存在Module._cache对象上,
模块路径,node在模块文件定位时的策略,当前目录node_modules -> 父目录下node_modules ->再上级目录下node_modules ----- ->直至根目录下的node_modules
模块分核心模块、路径形式模块、用户自定义模块(非路径形式),不同类型模块require引用过程不同见下
核心模块:node进程启动时,部分核心模块已加载进内存,引入时,路径分析优先判断,文件定位、编译执行两步省略,加载速度最快
路径形式模块:按路径定位文件并编译执行,编译执行后的结果放内存中,加载速度次之(相对核心模块)
用户自定义模块:require(test)--> 按照模块路径(见上)依次查找(test.js,test.json,test.node,)文件 -->文件找不到可找到同名目录test,此时node会将test目录当做包处理 --> 在test目录中找package.json文件,解析json中main属性定位文件 -->main属性错误则找test目录下的index文件(index.js,index.json,index.node);