简述:
require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例:
var a = {name: 1};
var b = a;
console.log(a); // { name: 1 }
console.log(b); // { name: 1 }
b.name = 2;
console.log(a); // { name: 2 }
console.log(b); // { name: 2 }
var b = {name: 3};
console.log(a); // { name: 2 }
console.log(b); // { name: 3 }
解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。
举例
使用exports导出
const hello = function () {
console.log('Hello world');
}
console.log('初始值==========');
console.log(exports);
console.log(module.exports);
console.log(module.exports === exports);
exports.hello = {
hello
}
console.log(module.exports);
console.log(exports);
// 输出结果
// 初始值==========
{}
{}
true
{ hello: [Function: hello] }
{ hello: [Function: hello] }
证明了: 初始默认module.exports和exports是空对象(并且内存地址是同一个),由于exports和module.export是指向同一块内存的,所以我们修改exports对象的数据,那么module.exports也会随之改变。
使用module.exports导出
const hello = function () {
console.log('Hello world');
}
console.log('初始值==========');
console.log(exports);
console.log(module.exports);
module.exports = {
hello
}
console.log(module.exports);
console.log(exports);
// 输出结果
// 初始值==========
{}
{}
{ hello: [Function: hello] }
{}
此时module.exports指向了一个新的内存地址,exports还是老的,由此说明exports = module.exports。
总结:
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports