关于模块和require,module,exports,module.exports的关系
require函数的伪代码:
const result = require('.myModule')
function require(modulePath) {
// 1.modulePath转为绝对路径
// 2.判断是否该模块已有缓存 如果有则返回缓存
// 3.读取文件内容
// 4.包裹到一个函数里面
function __temp(module, exports,require, __dirname, __filename) {
// 以下为modulePath文件内容
console.log(__dirname, __filename);
exports.c = 3;
//错误写法
module.exports = {
a: 1,
b: 2,
};
this.m = 5;
}
module.exports = {};
const exports = module.exports;
__temp.call(
module.exports,
module,
exports,
require,
module.path,
module.filename
);
}
当一个js文件被require的时候 module会自动传入进去,而且__temp会绑定module.exports,所以在js模块里面this === module.exports === exports 但是这三个最好不要混用 比如上面的错误代码混写 module.exports 赋值了一个新对象 会导致 module.exports 和 exports不相等 但是最后导出的是module.exports 导致后面再去改this和exports对象的值都不会导出 因为只会导出最后给module.exports赋值的对象。
上面代码不给module.exports赋值对象 就不会有问题
module.exports.a = 1
module.exports.b = 2
所以module导出的时候 不要混用这三个就不会有问题