Skip to content

Instantly share code, notes, and snippets.

@gleitz
Last active May 7, 2019 21:48
  • Star 14 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save gleitz/6896099 to your computer and use it in GitHub Desktop.
Reloading modules from the repl in Node.js
// Reloading modules from the repl in Node.js
// Benjamin Gleitzman (gleitz@mit.edu)
//
// Inspired by Ben Barkay
// http://stackoverflow.com/a/14801711/305414
//
// Usage: `node reload.js`
// You can load the module as usual
// var mymodule = require('./mymodule')
// And the reload it when needed
// mymodule = require.reload('./mymodule')
//
// I suggest using an alias in your .bashrc/.profile:
// alias node_reload='node /path/to/reload.js'
var myrepl = require("repl").start({});
/**
* Removes a module from the cache.
*/
myrepl.context.require.uncache = function (moduleName) {
// Run over the cache looking for the files
// loaded by the specified module name
myrepl.context.require.searchCache(moduleName, function (mod) {
delete require.cache[mod.id];
});
};
/**
* Runs over the cache to search for all the cached files.
*/
myrepl.context.require.searchCache = function (moduleName, callback) {
// Resolve the module identified by the specified name
var mod = require.resolve(moduleName);
// Check if the module has been resolved and found within
// the cache
if (mod && ((mod = require.cache[mod]) !== undefined)) {
// Recursively go over the results
(function run(mod) {
// Go over each of the module's children and
// run over it
mod.children.forEach(function (child) {
run(child);
});
// Call the specified callback providing the
// found module
callback(mod);
})(mod);
}
};
/*
* Load a module, clearing it from the cache if necessary.
*/
myrepl.context.require.reload = function(moduleName) {
myrepl.context.require.uncache(moduleName);
return myrepl.context.require(moduleName);
};
@john3exonets
Copy link

This code seems to not be resetting some that it should. After 'many' reloads, I get this error:

var pp = require.reload('../lib/myTestLib.js');
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
at process.EventEmitter.addListener (events.js:160:15)
at process.on.process.addListener (node.js:768:26)
at Object. (/Users/joallen/_Dev/Node.js/node_modules/log4js/lib/appenders/file.js:13:9)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at requireAppender (/Users/joallen/_Dev/Node.js/node_modules/log4js/lib/log4js.js:387:22)
undefined

I have to assume that it is something in the log4js modules that is messing things up.

@Globik
Copy link

Globik commented Nov 3, 2015

What is a module "repl"?

@FranckFreiburger
Copy link

Hello, maybe you can have a look at my module-invalidate.
It allows you to invalidate a module and then make it automatically reloaded on further access, without the need to call require() again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment