区别
Module.exports才是真正的接口,exports只不过是它的一个辅助工具。简单的来说exports 用于挂属性(常量或者属性)上去到module 最终返回给调用的是Module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
//在1.js
exports.money=50
exports.sayHi= function() {
console.log('Hi,I am dream_wk');
};
//在2.js
var wk= require('./rocker.js');
wk.sayHi(); //Hi,I am dream_wk
consoloe.log(wk.money)//50
从上面就可以看出exports其实就是挂属性在对象上,在require进文件后,我们可以在其他文件直接使用该对象的属性
//错误示范
//在1.js
module.exports = '错误示范';
exports.money=50
exports.sayHi= function() {
console.log('Hi,I am dream_wk');
};
//在2.js
var wk= require('./1.js');
consoloe.log(wk)
wk.sayHi();
consoloe.log(wk.money)//50
//上面会输出 错误示范 四个字
//然后报错
总结
1.exports是module.exports的一个引用
2.require引用模块后,返回给调用者的是module.exports而不是exports
3.exports.xxx,相当于在导出对象上挂属性,该属性对调用模块直接可见
4.exports =相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性(下面代码就是例子)
5.如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例
//
//在1.js
exports = "123"
exports.money=50
exports.sayHi= function() {
console.log('Hi,I am dream_wk');
};
//在2.js
var wk= require('./1.js');
consoloe.log(wk)
wk.sayHi();
consoloe.log(wk.money)
//上面会输出 空对象{} 因为在1.js 里面对exports进行了重新定义 所以在2.js文件中require时 并不是将新定义的exports引进去 他还是引进了module 也就是说在1.js中的exports = "123" 使得exports不再是module的一个引用了(也就不可通过exports.money=50去挂载属性在要导出的对象module上 了)
建议
对于要导出的属性,可以简单直接挂到exports对象上 或者也可以像下面这样
//1.js中
module.exports = {
name:"dream_wk",
sayHi(){
console.log("HI")}
};
//2.js中
var wk= require('./1.js');
consoloe.log(wk.name);
wk.sayHi()
对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起