0

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

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

我知道您可以将对象或函数绑定到exports对象以将它们公开给不同的文件,但似乎它正在调用已绑定到对象的函数。但是,我一直认为您需要以require这种方式访问​​文件和访问功能。这里发生了什么?

4

2 回答 2

0

这是插件延迟加载的实现。只有在第一次使用他的名字访问模块属性后,插件才会被加载。__defineGetter__是 ECMAScript 标准中未提供的“语法糖”。它将对象的属性绑定到查找该属性时要调用的函数。

于 2012-08-19T04:22:39.810 回答
0

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

不过,这不是这里发生的事情。在执行您显示的代码时,__defineGetter__已经定义了一个名为的函数并将其附加到exports. 在这里,它只是作为一个方法被调用exports(大概是因为作者觉得没有必要为它创建一个冗余的本地名称)。

即沿线某处有类似的东西

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

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

Obviously the purpose of the code here is to allow you to call cluster.nameOfPlugin.method(...) without having to manually require each plugin, while not requiring all the possible plugins to be preloaded; instead only the ones you actually use get loaded.

于 2012-08-19T04:40:11.403 回答