一、module.exports与exports的区别
在写node的自定义模块的时候,经常是直接module.exports={}完事,但是偶然间看到exports.fn = function(){},感觉少些了一个module,更加简洁于是我想搞清楚他们的区别。
区别:
exports返回的是模块函数
module.exports返回的是模块对象本身,返回的是一个类
使用上的区别是:
exports的方法可以直接调用
module.exports需要new对象之后才可以调用
exports案例
正确例子:
//demo1.js
function Persion2(){
console.log("agam2");
}
exports.Persion2=Persion2;
console.log(exports)
console.log(module.exports)
//index.js
const persion=require("./demo1")
persion.Persion2()
//{ Persion2: [Function: Persion2] }
//{ Persion2: [Function: Persion2] }
//agam2
发现此时exports和module.exports对象输出的都是一个sayHello方法,
为什么module.exports也有exports方法了,简单点理解就是:exports只是module.exports的全局引用
接下来,我们修改下
错误例子:
//demo1.js
class Persion{
constructor(age){
this.age=age;
}
getName(){
return "agam";
}
}
exports.Persion2=Persion;
console.log(exports)
console.log(module.exports)
//index.js
const persion=require("./demo1")
persion.Persion()
//Class constructor Persion cannot be invoked without 'new'
可见上面的结论exports返回的是模块函数。
既然exports是moudle.exports的一个引用,那么exports能做的moudle.exports都能做,不能做的moudle.exports也能做。
//demo1.js
class Persion{
constructor(age){
this.age=age;
}
getName(){
return "agam";
}
}
function Persion2(){
console.log("agam2");
}
module.exports=Persion;
//index.js
const persion=require("./demo1")
let p =new persion();
console.log(p.getName())
//agam2
总结
- exports只是module.exports的引用
- 如果你想要使用exports导出模块,千万不能给它赋值!
- 稳一点的做法是使用module.exports,虽然exports用起来是挺爽的
本节代码
网友评论