2013-03-27 8 views
37

Lassen Sie sagen, nachdem ich ein Modul und etwas tun, wie unten erfordern:Wie Modul nach "require" in node.js entfernen?

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

Dann Modul b wegzunehmen (die Cache-d aufzuräumen) ich will. wie kann ich es tun?

Der Grund ist, dass ich das Modul dynamisch laden/entfernen oder aktualisieren möchte, ohne den Knotenserver neu zu starten. irgendeine Idee?

------- mehr -------- basiert auf dem Vorschlag require.cache zu löschen, es immer noch nicht funktioniert ...

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 

Wenn jedoch ich rufe b, es ist immer noch da! es ist noch zugänglich. wenn ich das nicht tue:

b = {}; 

nicht sicher, ob es ein guter Weg ist, damit umzugehen. , wenn ich später ('./b.js') erneut benötige, während b.js geändert wurde. Benötigt es die alten zwischengespeicherten b.js (die ich zu löschen versuchte), oder die neue?

----------- Mehr Befund --------------

ok. i tun mehr Tests und mit dem Code herumspielen .. hier ist das, was ich gefunden habe:

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. 
+0

Die Variable Sie das Ergebnis 'erfordern assign ('./ b')' zu werden nicht gelöscht, die 'delete' Betrieb können Sie nur eine Datei ein verlangen das zweite Mal, ohne eine zwischengespeicherte Version zu erhalten, aber die Variable wird nicht magisch aktualisiert, wenn Sie tun. – robertklep

+0

ja .. du hast recht .. und hier ist, was ich herausfinden ... (siehe meine edition) – murvinlai

+0

mögliche duplikate von [node.js require() cache - möglich zu invalidieren?] (Http://stackoverflow.com/ fragen/9210542/node-js-require-cache-möglich-zu-invalidate) – Gajus

Antwort

77

Sie können mit dieser seinen Eintrag im Cache löschen:

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

require.resolve() das herauszufinden wird vollständiger Pfad von ./b.js, der als Cache-Schlüssel verwendet wird.

+0

Oh .. lass mich es versuchen. Also wird der vollständige Pfad module.filename sein? – murvinlai

+1

Versuchen Sie es einfach. Ich denke, es ist komplizierter als nur Löschen. Doing löschen entfernen Sie den Cache der obersten Ebene. Da b.js jedoch ein Kind von a.js ist, wurde es auch als Kind in a.js zwischengespeichert. Also, ich denke, ich muss auch das Kind von a.js – murvinlai

+2

entfernen Beachten Sie, dass Sie möglicherweise auch alles entfernen müssen, das './B.js' erfordert auch. Je nach Anwendungsfall kann die Kernoption geeignet sein: '_.each (_. Keys (require.cache), function (key) {delete require.cache [key];})' – mikermcneil

0

Ich habe festgestellt, der einfachste Weg, um die Ungültigkeitserklärung des Caches ist eigentlich das freiliegende Cache-Objekt zurückgesetzt. Wenn einzelne Einträge aus dem Cache gelöscht werden, werden die Kindabhängigkeiten ein wenig mühsam, um durchzulaufen.

require.cache = {};

+2

Laut [dieser Antwort] (http://stackoverflow.com/a/23686122/1836935) das Ändern des Cache-Objekts tut nichts und Sie müssen seine Schlüssel löschen –

+1

Das ist falsch, nur das Löschen des Schlüssels entfernt tatsächlich das zwischengespeicherte Modul. – lonewarrior556