我刚刚浏览了nodejs源代码,注意到不同模块的导出方式不同。例如,某些模块导出具有原型继承样式的对象:
Thing = function () {
constructor stuff
}
Thing.prototype.jump () {
jump stuff
}
exports = Thing
当其他模块将函数直接附加到导出时:
exports.spectacles = function () {
spectacle stuff
}
在我看来,他们似乎会实现类似的目标,但他们显然是不同的。我相信第一个示例描述了类似于A类的内容,而第二个示例只提供了可用的静态方法。
这两种方法之间的根本区别是什么?它们是如何恰当地描述的?它们之间的优缺点是什么?
最佳答案
试着从另一个角度来看:需要您的模块的模块。
节点中的每个文件都是一个模块。每个模块都有一个全局变量module
,它的属性是exports
。无论您在exports
属性上放置什么,都可以作为模块的导出。
原始的
即布尔值、数字或字符串将起作用:
module.exports = 3;
当你需要那个文件时,你会得到“3”。
var myModule = require('./my-module');
console.log(myModule); // <== 3
但是由于javascript中的所有内容都是一个对象,因此您可以调用方法,甚至是一个基本道具:
console.log(myModule.toString()); // <== "3"
功能
也可以导出函数。
module.exports = function() {
console.log('3 more');
};
该导出将是一个函数:
var myModule = require('./my-module');
myModule(); // <== '3 more'
当然,一个函数也是一个对象,所以你也可以尝试一些方法。
console.log(myModule.toString());
// You get: 'function (){\n console.log(\'3 more\');\n }'
对象
然后可以导出包含以下内容的对象:
module.exports = {
prop: 3,
method: function() {
console.log('Not 3 this time.');
}
};
当您需要这个模块时,您将拥有这个对象—一个属性
prop
和方法method
的对象。var myModule = require('./my-module');
console.log(myModule.prop); // <== 3
myModule.method(); // <== 'Not 3 this time'
所以你明白了吗?无论你在module.exports中放了什么,都是你在另一端得到的。正如我所说,这是一个观点问题。
违约
即使你没有导出任何东西(即需要一个空文件),你也有一个导出。
需要一个空文件(它必须存在于
var myModule = require('./my-module');
console.log(myModule); // <== {}
这告诉您默认导出为空对象。
这就是它变得有趣的地方。
如果module.exports={}在默认情况下,那么如果我们只是附加到它,我们可以向它添加道具:
所以,当node第一次获取模块(文件)时,它是{}。我们可以简单地把道具系在上面。
module.exports.prop = 3;
module.exports.method = function() { console.log('I am out of ideas for placeholders, I should use kitten');}
为什么它没有
module
关键字?现在,为什么不使用module关键字呢?也就是说:
exports.prop = 3;
exports.method = function() {};
因为node.js开始处理文件时,它会将导出别名设置为module.exports。但是小心点,你可以超越它!
那是什么意思?就好像你在文件的开头写了
var exports = module.exports
。所以您可以只使用
exports
语法,但我不喜欢。为什么?因为您可能会犯错误并重写exports
var.,而且在使用module.exports时会更加小心。(还有其他的原因,这一个是我第一次了解并记得最清楚的。)例1:
exports.prop = false;
// later in module
module.exports = myObj; // see? overriden.
例2:
var exports = {}; // see? Overridden default module.exports.
exports.prop = 4;
exports.method = function(){
console.log('3 more');
};
所以当你以后需要的时候:
var myModule = require('./my-module');
console.log(myModule); // <== {}
我希望这能有帮助。
关于node.js - nodejs模块及其导出之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24623575/