Module
在NodeJS中,一个文件就是一个单独的模块。每个模块内部,module变量代表当前模块。
在一个模块js内部打印下module:
// a.js
require("./b.js");
console.log(module);
id,模块的标识符exports,模块的导出对象parent,表示当前模块的父模块,当前模块是谁加载的filename,模块的绝对路径loaded,表示是否加载完成children,表示当前模块加载了哪些模块paths,表示模块的搜索路径,路径的多少取决于目录的深度,寻找第三方模块时会用到
在模块的内部,this指向的是当前模块的导出对象:this === module.exports;
require
加载流程
- 找到需要加载的模块文件
- 判断是否缓存过,如果有,则直接返回缓存中的内容;如果没有,就读取模块文件
- 把读取到的内容放到一个自执行函数中执行
(function (exports, require, module, __filename, __dirname) {
//模块的代码实际上在这里
});
4. 返回module.exports需要导出的内容
支持类型
Node.jS支持三种类型的文件,.js、.json、.node(C++扩展二进制模块)。
当加载一个不带后缀的文件时,会依次尝试上述后缀文件
模块类型分为核心模块、文件模块、第三方模块,其中核心模块是编译二进制文件,加载速度最快,比如fs/path/http等。
exports
exports 是对外接口,它只是 module.exports 的一个引用。所以本质上,加载某个模块,是加载该模块的 module.exports
如果在代码中改变了exports的引用,那么会导致require模块失败
exports = { a:1 }; // error
正确的是
exports.a = 1;
// 或者
module.exports = {
a:1
}