web-dev-qa-db-ja.com

node.jsでのmodule.parentの使用は何ですか? require()ingモジュールをどのように参照できますか?

node.js module のドキュメントを調べていたところ、各モジュールにプロパティ-module.parent。私はそれを使おうとしましたが、モジュールキャッシング-module.parentは、現在のコンテキストに関係なく、最初にrequire()を実行したモジュールだけに思われます。

それでそれの使い方は何ですか? currentrequire()ingモジュールへの参照を取得する他の方法はありますか?現在、モジュールを関数にラップしているので、次のように呼び出されます。

require("mylibrary")(module)

しかし、それは次善のようです。

36
Alastair

「親」は、スクリプトを解釈(およびキャッシュ)するモジュールです(存在する場合)。

// $ node foo.js
console.log(module.parent); // `null`
// require('./foo')
console.log(module.parent); // `{ ... }`

期待しているのは「呼び出し元」であり、Nodeは保持されません。そのためには、現在使用しているエクスポートされた関数がクロージャーのクロージャーになる必要があります値。

43

これには回避策があります。 Nodeは、モジュールのロードが完了する前にモジュールをモジュールキャッシュに追加します。これは、モジュールが自身から自身を削除できることを意味しますロード中のモジュールキャッシュ!モジュールがrequire 'daになるたびに、モジュールの新しいインスタンスがロードされます。

Magic.js

console.log('Required by ' + module.parent.filename);
delete require.cache[__filename];

Module1.js

//prints "Required by Module1.js"
require('./Magic');

Module2.js

//prints "Required by Module2.js"
require('./Magic');

もちろん、これの副作用として、モジュールはシングルトンではなくなります。そのため、Magic.jsをコーディングする必要があります。グローバルデータを保存する必要がある場合は、キャッシュからそれ自体を削除しないrequire()されたモジュールにいつでも保持できます。

22
Roy Paterson