web-dev-qa-db-fra.com

Comment supprimer le module après "require" dans node.js?

Disons, après avoir besoin d'un module et faire quelque chose comme ci-dessous:

var b = require('./b.js');
--- do something with b ---

Ensuite, je veux retirer le module b (c'est-à-dire nettoyer le cache). comment je peux le faire?

La raison en est que je souhaite charger/supprimer ou mettre à jour dynamiquement le module sans redémarrer le serveur de noeud. une idée?

------- plus -------- basé sur la suggestion de supprimer require.cache, cela ne fonctionne toujours pas ...

what I did are few things:
1) delete require.cache[require.resolve('./b.js')];
2) loop for every require.cache's children and remove any child who is b.js
3) delete b

Cependant, quand j'appelle b, il est toujours là! il est toujours accessible. à moins que je ne le fasse:

b = {};

je ne sais pas si c'est un bon moyen de gérer cela. car si plus tard, je demande à nouveau ('./b.js') alors que b.js a été modifié. Aura-t-il besoin de l'ancien b.js mis en cache (que j'ai essayé de supprimer), ou du nouveau?

----------- Plus de résultats --------------

d'accord. je fais plus de tests et de jouer avec le code .. voici ce que j'ai trouvé:

1) delete require.cache[]  is essential.  Only if it is deleted, 
 then the next time I load a new b.js will take effect.
2) looping through require.cache[] and delete any entry in the 
 children with the full filename of b.js doesn't take any effect.  i.e.
u can delete or leave it.  However, I'm unsure if there is any side
effect.  I think it is a good idea to keep it clean and delete it if
there is no performance impact.
3) of course, assign b={} doesn't really necessary, but i think it is 
 useful to also keep it clean.
50
murvinlai

Vous pouvez l'utiliser pour supprimer son entrée dans le cache:

delete require.cache[require.resolve('./b.js')]

require.resolve() trouvera le chemin complet de ./b.js, qui est utilisé comme clé de cache.

103
robertklep

L'une des façons les plus simples (bien que pas les meilleures en termes de performances car même les caches de modules non liés sont effacés) serait de purger simplement chaque module du cache

Notez que l'effacement du cache pour *.node les fichiers (modules natifs) peuvent provoquer un comportement indéfini et ne sont donc pas pris en charge ( https://github.com/nodejs/node/commit/5c14d695d2c1f924cf06af6ae896027569993a5c ), il doit donc y avoir une instruction if pour assurez-vous que ceux-ci ne sont pas supprimés du cache également.

    for (const path in require.cache) {
      if (path.endsWith('.js')) { // only clear *.js, not *.node
        delete require.cache[path]
      }
    }
3
mkg20001

J'ai trouvé que le moyen le plus simple de gérer l'invalidation du cache est en fait de réinitialiser l'objet de cache exposé. Lors de la suppression d'entrées individuelles du cache, les dépendances enfants deviennent un peu gênantes à parcourir.

require.cache = {};
1
Jason Graves