1、nodejs里面的模块是什么
一个模块就是一个对象, 如下描述:
function Module(id, parent) {
this.id = id;
this.exports = {};
this.parent = parent;
this.filename = null;
this.loaded = false;
this.children = [];
}
module.exports = Module;
var module = new Module(filename, parent);
2、模块是如何加载的
nodejs中我们使用require加载模块,一共经历了如下四个步骤:
-
计算模块路径
-
判断模块是否在缓存中, 如果在,从缓存中获取
-
加载模块
-
输出模块的exports属性
// require 其实内部调用 Module._load 方法 Module._load = function(request, parent, isMain) { // 计算绝对路径 var filename = Module._resolveFilename(request, parent);
// 第一步:如果有缓存,取出缓存 var cachedModule = Module._cache[filename]; if (cachedModule) { return cachedModule.exports;
// 第二步:是否为内置模块 if (NativeModule.exists(filename)) { return NativeModule.require(filename); }
/******这里注意了/ // 第三步:生成模块实例,存入缓存 // 这里的Module就是我们上面的1.1定义的Module var module = new Module(filename, parent); Module._cache[filename] = module;
/******这里注意了/ // 第四步:加载模块 // 下面的module.load实际上是Module原型上有一个方法叫Module.prototype.load try { module.load(filename); hadException = false; } finally { if (hadException) { delete Module._cache[filename]; } }
// 第五步:输出模块的exports属性 return module.exports; };