我刚刚浏览了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语法,但我不喜欢。为什么?因为您可能会犯错误并重写exportsvar.,而且在使用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/

10-15 00:36
查看更多