你确定对Node.js
模块中用来建立函数的exports
对象很熟悉(假设一个名为rocker.js
的文件):javascript
exports.name = function() { console.log('My name is Lemmy Kilmister'); };
而后你在另外一个文件中调用:java
var rocker = require('./rocker.js'); rocker.name(); // 'My name is Lemmy Kilmister'
可是module.exports
究竟是个什么玩意儿? 它合法吗?数组
使人吃惊的是-module.exports
是真实存在的东西。exports
只是module.exports
的辅助方法。你的模块最终返回module.exports
给调用者,而不是exports
。exports
所作的事情是收集属性,函数
若是module.exports
当前没有任何属性的话,exports
会把这些属性赋予module.exports
。若是module.exports
已经存在一些属性的话,那么exports
中所用的东西都会被忽略。ui
把下面的内容放到rocker.js
:this
module.exports = 'ROCK IT!'; exports.name = function() { console.log('My name is Lemmy Kilmister'); };
而后把下面的内容放到另外一个文件中,执行它:spa
var rocker = require('./rocker.js'); rocker.name(); // TypeError: Object ROCK IT! has no method 'name'
rocker模块彻底忽略了exports.name
,而后返回了一个字符串’ROCK IT!’。经过上面的例子,你可能认识到你的模块不必定非得是模块实例(module instances)。code
你的模块能够是任何合法的JavaScript对象 - boolean,number,date,JSON, string,function,array和其余。你的模块能够是任何你赋予module.exports
的值。对象
若是你没有明确的给module.exports
设置任何值,那么exports
中的属性会被赋给module.exports
中,而后并返回它。blog
在下面的状况下,你的模块是一个类:
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; };
而后你应该这样使用它:
var Rocker = require('./rocker.js'); var r = new Rocker('Ozzy', 62); r.about(); // Ozzy is 62 years old
在下面的状况下,你的模块是一个数组:
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
而后你应该这样使用它:
var rocker = require('./rocker.js'); console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
如今你应该找到要点了 - 若是你想要你的模块成为一个特别的对象类型,那么使用module.exports
;若是你但愿你的模块成为一个传统的模块实例
(module instance),使用exports
。
把属性赋予module.exports
的结果与把属性赋予给exports
是同样的。看下面这个例子:
module.exports.name = function() { console.log('My name is Lemmy Kilmister'); };
下面这个作的是同样的事情:
exports.name = function() { console.log('My name is Lemmy Kilmister'); };
可是请注意,它们并非同样的东西。就像我以前说的module.exports
是真实存在的东西,exports
只是它的辅助方法。话虽如此,exports
仍是推荐的对象,除非你想把你模块 的对象类型从传统的模块实例
(module instance)修改成其余的。
我但愿这篇文章能帮助你理解exports
和module.exports
之间的不一样,而且能进一步的理解模块在Node.js
中是怎么工做的。若是有任何问题,请在回复里边留言。