用代码测试下,同时用module.exports
和exports
导出属性,默认会使用谁导出的。
\ app.json
module.exports = {
name: "module.exports",
};
exports.name = "exports";
\ main.js
let app = require("./app.js");
console.log(app.name); //输出 “module.exports”
看来,同时用module.exports
和exports
导出属性。会默认使用module.exports
导出的属性。
最开始 module.exports
和exports
输出的都是一个空对象。
console.log(module.exports); // 输出 {}
console.log(exports); // 输出 {}
console.log(module.exports === exports); // 输出 true
通过给 exports
赋值属性
console.log(module.exports);
console.log(exports);
console.log(module.exports === exports);
exports.name = "exports"; // 赋值属性
console.log(module.exports === exports); // 输出true
console.log(module.exports.name); // 输出"exports"
到这一步,module.exports
和 exports
指代的还是同一对象。
在给 exports
属性赋值为一个对象
console.log(module.exports);
console.log(exports);
console.log(module.exports === exports); // 输出 true
exports = {
name: "exports",
};
console.log(module.exports === exports); // 输出 false
console.log(module.exports.name); // 输出 undefined
到这里,module.exports
和 exports
指代的就不是同一引用了,已经是不同的对象了。
原因: exports对象是通过形参的方式传入的,直接赋值形参会改变形参的引用,但并不能改变作用域外的值。module.exports就是为了解决exports直接赋值的问题而产生的。为了减少BUG,尽量不使用exports就行了。