murvinlai murvinlai - 4 months ago 9
Node.js Question

How to remove module after "require" in node.js?

Let say, after I require a module and do something as below:

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


Then I want to take away module b (i.e. clean up the cache). how I can do it?

The reason is that I want to dynamically load/ remove or update the module without restarting node server. any idea?

------- more --------
based on the suggestion to delete require.cache, it still doesn't work...

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


However, when i call b, it is still there! it is still accessible. unless I do that:

b = {};


not sure if it is a good way to handle that.
because if later, I require ('./b.js') again while b.js has been modified. Will it require the old cached b.js (which I tried to delete), or the new one?

----------- More finding --------------

ok. i do more testing and playing around with the code.. here is what I found:

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.

Answer

You can use this to delete its entry in the cache:

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

require.resolve() will figure out the full path of ./b.js, which is used as a cache key.