web-dev-qa-db-fra.com

Quelle est l'utilisation de module.parent dans node.js? Comment puis-je me référer au module require () ing?

Je cherchais dans la documentation module node.js , et j'ai remarqué que chaque module a une propriété- module.parent. J'ai essayé de l'utiliser, mais j'ai été brûlé par la mise en cache du module - module.parent ne semble toujours au module que d'abord () = , quel que soit le contexte actuel.

Alors à quoi ça sert? Existe-t-il un autre moyen pour moi d'obtenir une référence au module actuel require () ing? En ce moment, j'encapsule le module dans une fonction, de sorte qu'il s'appelle comme:

require("mylibrary")(module)

mais cela semble sous-optimal.

36
Alastair

Le "parent" est le module qui a provoqué l'interprétation et la mise en cache du script, le cas échéant:

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

Ce que vous attendez est "l'appelant", qui Node ne retient pas pour vous. Pour cela, vous aurez besoin de la fonction exportée que vous utilisez actuellement pour clôturer le valeur.

43
Jonathan Lonowski

Il existe une solution pour cela. Node ajoute un module au cache de module avant de terminer le chargement. Cela signifie qu'un module peut se supprimer de le cache du module pendant son chargement! Ensuite, chaque fois que le module est require ', une nouvelle instance du module est chargée.

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');

Bien sûr, l'effet secondaire est que votre module n'est plus un singleton, vous devez donc coder Magic.js dans cet esprit. Si vous avez besoin de stocker des données globales, vous pouvez toujours les conserver dans un module ed de require () qui ne se supprime pas lui-même du cache.

22
Roy Paterson