node.js中module.exports与exports用法上的区别
Node.js引入了模块(Module)概念,一个模块可以通过module.exports或exports将函数、变量等导出,以使其它JavaScript脚本通过require()函数引入并使用。
module.exports初始值为一个空对象{},所以exports初始值也是{},exports是指向的module.exports的引用,在模块内部大概是这样:
exports=module.exports={};
举个栗子,在node.js中创建模块非常简单,一个文件就是一个模块,所以我们创建一个name.js文件就创建了一个模块name.js,使用exports和require对象对外提供接口和引用模块。
name.js
varmyName=function(){ varname='AmberYLopez'; console.log(name); }; exports.myName=myName;
这样在使用的时候需要这样
app.js
varname=require('./name');
如果我们创建的name.js文件是使用module.exports和require对象对外提供接口和引用模块。
name.js
varmyName=function(){ varname='AmberYLopez'; console.log(name); }; module.exports=myName;
app.js
varname=require('./name');
exports赋值其实是给module.exports这个空对象添加myName属性而已,为什么exports要使用添加属性的方式,而不用exports=myName?
exports是引用module.exports的值。exports被改变的时候,module.exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。
如果将name.js改为
varmyName=function(){ varname='AmberYLopez'; console.log(name); }; exports=myName;
app.js
varname=require('./name');<br>console.log(name);
运行会报错。因为,前面是通过给exports添加属性,而现在对exports指向的内存做了修改,exports和module.exports不再指向同一块内存,即module.exports指向的那块内存并没有做任何改变,仍然为一个空对象{},所以会报错。