44 votes

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

Je regardais dans le module node.js et j'ai remarqué que chaque module a une propriété module.parent . J'ai essayé de l'utiliser, mais je me suis fait griller par le module caching-. module.parent ne semble jamais qu'au module que le premier require() l'a fait quel que soit le contexte actuel.

Alors, quel est son usage ? Existe-t-il un autre moyen pour moi d'obtenir une référence à l'élément actuel module require()ing ? Pour l'instant, j'intègre le module dans une fonction, de manière à ce qu'il soit appelé de la manière suivante :

require("mylibrary")(module)

mais cela semble sous-optimal.

53voto

Jonathan Lonowski Points 45253

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 le "caller", que Node ne retient pas pour vous. Pour cela, vous aurez besoin de la fonction exportée que vous utilisez actuellement pour être une fermeture pour la valeur.

29voto

Jay Goldfarb Points 531

Il existe une solution de contournement pour cela. Node ajoute un module au cache du module avant de finir de le charger. Cela signifie qu'un module peut se supprimer du cache du module pendant qu'il est en train de se charger ! Ensuite, chaque fois que le module est require lorsqu'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 de ceci est que votre module n'est plus un singleton, donc vous devez coder Magic.js en gardant cela à l'esprit. Si vous avez besoin de stocker des données globales, vous pouvez toujours les conserver dans un module require()'ed qui ne s'efface pas du cache.


Mise à jour pour 2022

Notez que la technique décrite ci-dessus ne fonctionne pas pour les modules ES inclus dans le système d'exploitation. import . Pour autant que je sache, il n'existe pas de bon moyen de détecter le module ES importateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X