exports和module.exports
exports代表导出对象,它是一个全局对象。经exports导出对象的属性可以用require函数引用。
如在hello
中
function hello(){
console.log('hello world!');
}
//给exprots添加hello属性可讲将hello函数导出
exports.hello=hello;
在test.js
中使用它
//hello表示hello.js导出对象exports
var hello = require('../routes/hello.js');
//调用exports对象的hello属性并执行
hello.hello();
在node命令行执行 node test.js
输出hello world!
。
声明和导入,这样看起来很完美了,那module.exports是干什么的?原因就在使用exprots
导出必须为其添加属性而不能重写exports对象。比如上例我只导出一个函数,直接重写exports对象是不允许的。
exports=hello; //错误,这样写不会正确导出
正因这样,就需要使用到module.exports
,它可以导出单个对象。用module.exports
导出上例的对象:
//hello.js
function hello(){
console.log('hello world!');
}
module.exports= hello;
//test.js
var hello = require('../routes/hello.js');
hello();
深入exports和module.exports
那我们深入一下,exports和module.exports究竟什么关系。
exports其实是module.exports的一个全局引用。可以把前者当作后者的一个简写。对exports添加属性也相当于对module.exports添加属性(因为它们引用相同,指向同一地方),而当我们对exports重新赋值后,exports将不再指向module.exports。
下面例子演示了这个过程:
//原对象,模拟module.exports
var source = {
a1:12,
};
//复制对象,模拟exports,其保留对source对象引用
var copy = source;
//添加一个对象,两对象输出结果一致
copy.b2 = 23;
console.log(source); //{ a1: 12, b2: 23 }
console.log(copy); //{ a1: 12, b2: 23 }
//改变copy对象引用,两对象结果不一致
copy = 34;
console.log(source); //{ a1: 12, b2: 23 }
console.log(copy); //34