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

モジュールがexports任意のオブジェクトではなく単一の関数に設定されている場合、 の結果はrequire直接呼び出すことができる関数参照になります (関数は実際にはオブジェクトの型であり、プロパティを持つことができることに注意してください。機能)。

しかし、それはここで起こっていることではありません。あなたが示したコードが実行された時点で、 という関数__defineGetter__がすでに定義され、 にアタッチされていますexports。ここでは単にメソッドとして呼び出されていますexports(おそらく、作成者が冗長なローカル名を作成する必要性を感じていなかったからでしょう)。

つまり、どこかに次のようなものがあります

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

ローカル名がないため、呼び出す唯一の方法はexports.

ここでのコードの目的は明らかに、すべての可能なプラグインをプリロードする必要がなく、各プラグインcluster.nameOfPlugin.method(...)を手動で呼び出さなくても呼び出せるようにすることです。require代わりに、実際に使用するものだけが読み込まれます。

于 2012-08-19T04:40:11.403 に答える
0

これは、プラグインの遅延読み込みの実現です。プラグインは、自分の名前でモジュール プロパティに最初にアクセスした後にのみ読み込まれます。__defineGetter__は、ECMAScript 標準で提示されていない「構文糖衣」です。オブジェクトのプロパティを、そのプロパティがルックアップされたときに呼び出される関数にバインドします。

于 2012-08-19T04:22:39.810 に答える