我正在阅读cluster package的cluster.js
文件,这部分让我感到困惑:
fs.readdirSync(__dirname + '/plugins').forEach(function(plugin){
plugin = plugin.replace('.js', '');
exports.__defineGetter__(plugin, function(){
return require('./plugins/' + plugin);
});
});
我知道您可以将对象或函数绑定到exports
对象以将它们暴露给不同的文件,但似乎它正在调用已绑定到该对象的函数。但是,我一直认为你需要require
文件和访问函数。这是怎么回事?
答案 0 :(得分:0)
这是插件lazy loading的实现。只有在首次使用名称访问module属性后才会加载插件。 __defineGetter__
是'语法糖'未在ECMAScript标准中提供。它将对象的属性绑定到查找该属性时要调用的函数。
答案 1 :(得分:0)
如果模块将exports
设置为单个函数而不是任意对象,那么require
的结果将是一个可以直接调用的函数引用(注意函数实际上是一个类型)对象,因此可以具有属性,也可以是函数)。
__defineGetter__
的函数并将其附加到exports
。在这里,它被简单地称为exports
的方法(可能是因为作者没有觉得需要为它创建一个冗余的本地名称)。
即。沿着这个地方的某个地方就像是
exports.__defineGetter__ = function(propname, getter) {
...
}
由于它没有本地名称,因此调用它的唯一方法是exports
。
显然,此处代码的目的是允许您在不必手动cluster.nameOfPlugin.method(...)
每个插件的情况下调用require
,同时不要求预先加载所有可能的插件;而只是你实际使用的那些被加载。