2013-03-27 14 views
37

powiedzmy, po tym, jak wymagają moduł i zrobić coś jak poniżej:Jak usunąć moduł po "require" w pliku node.js?

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

Następnie chcę zabrać moduł B (to znaczy oczyścić pamięć podręczną). jak mogę to zrobić?

Powodem jest to, że chcę dynamicznie ładować/usuwać lub aktualizować moduł bez restartowania serwera węzła. dowolny pomysł?

------- -------- bardziej opiera się na sugestii, aby usunąć require.cache, to nadal nie działa ...

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 

Jednak, gdy Wzywam b, nadal tam jest! jest nadal dostępny. chyba że to zrobię:

b = {}; 

nie jestem pewien, czy jest to dobry sposób na obsłużenie tego. ponieważ później, wymagam ('./b.js') ponownie, podczas gdy b.js został zmodyfikowany. Czy będzie wymagać starego buforowanego pliku b.js (który próbowałem usunąć), czy nowego?

----------- Więcej informacji --------------

ok. zrobić więcej badań i odtwarzanie z kodem .. oto co znalazłem:

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

Zmienna przypisać wynik 'require ('./ b')' nie zostanie usunięty, 'delete' operacja będzie tylko pozwalają wymagać złożyć Drugi raz bez uzyskania wersji z pamięci podręcznej, ale zmienna nie zostanie magicznie zaktualizowana, kiedy to zrobisz. – robertklep

+0

tak .. ur right .. i tutaj jest to, co znajdę ... (zobacz moje wydanie) – murvinlai

+0

możliwy duplikat [node.js require() cache - możliwe do unieważnienia?] (Http://stackoverflow.com/ pytania/9210542/node-js-require-cache-possible-to-invalidate) – Gajus

Odpowiedz

77

Można to wykorzystać, aby usunąć swój wpis w cache:

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

require.resolve() będzie dowiedzieć się pełna ścieżka ./b.js, która jest używana jako klucz pamięci podręcznej.

+0

Oh .. pozwól mi spróbować. , więc pełna ścieżka będzie module.filename? – murvinlai

+1

Po prostu spróbuj. Myślę, że jest to bardziej skomplikowane niż zwykłe usuwanie. wykonanie delete usuwa pamięć podręczną najwyższego poziomu. Ponieważ jednak b.js jest potomkiem pliku a.js, to także jest buforowane jako dziecko w pliku a.js. Tak więc, myślę, że muszę również usunąć dziecko a.js. – murvinlai

+2

. Zauważ, że możesz również usunąć wszystko, co również wymaga './B.js'. W zależności od przypadku użycia opcja jądrowa może być odpowiednia: '_.each (_. Klucze (require.cache), function (key) {delete require.cache [key];})' – mikermcneil

0

Odkryłem, że najprostszym sposobem na unieważnienie pamięci podręcznej jest zresetowanie obiektu narażonego na cache. Podczas usuwania pojedynczych wpisów z pamięci podręcznej zależności potomne stają się nieco kłopotliwe przy iteracji.

require.cache = {};

+2

Według [tej odpowiedzi] (http://stackoverflow.com/a/23686122/1836935) zmiana obiektu pamięci podręcznej nic nie robi i trzeba usunąć jego klucze –

+1

To jest złe, tylko usunięcie klucza faktycznie usuwa buforowany moduł. – lonewarrior556