直接调用绑定到exports对象的函数

时间:2012-08-19 04:10:55

标签: node.js

我正在阅读cluster packagecluster.js文件,这部分让我感到困惑:

fs.readdirSync(__dirname + '/plugins').forEach(function(plugin){
  plugin = plugin.replace('.js', '');
  exports.__defineGetter__(plugin, function(){
    return require('./plugins/' + plugin);
  });
});

我知道您可以将对象或函数绑定到exports对象以将它们暴露给不同的文件,但似乎它正在调用已绑定到该对象的函数。但是,我一直认为你需要require文件和访问函数。这是怎么回事?

2 个答案:

答案 0 :(得分:0)

这是插件lazy loading的实现。只有在首次使用名称访问module属性后才会加载插件。 __defineGetter__是'语法糖'未在ECMAScript标准中提供。它将对象的属性绑定到查找该属性时要调用的函数。

答案 1 :(得分:0)

如果模块将exports设置为单个函数而不是任意对象,那么require的结果将是一个可以直接调用的函数引用(注意函数实际上是一个类型)对象,因此可以具有属性,也可以是函数)。

但是,这不是在这里发生的事情。在您执行的代码执行时,已经定义了一个名为__defineGetter__的函数并将其附加到exports。在这里,它被简单地称为exports的方法(可能是因为作者没有觉得需要为它创建一个冗余的本地名称)。

即。沿着这个地方的某个地方就像是

exports.__defineGetter__ = function(propname, getter) {
...
}

由于它没有本地名称,因此调用它的唯一方法是exports

显然,此处代码的目的是允许您在不必手动cluster.nameOfPlugin.method(...)每个插件的情况下调用require,同时不要求预先加载所有可能的插件;而只是你实际使用的那些被加载。