Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js listen for module load

With RequireJS on the front-end, we can listen to see when modules get loaded into the runtime module cache using:

requirejs.onResourceLoad = function (context, map, depArray) {
    console.log('onResourceLoad>>>', 'map.id:', map.id, 'context:', context);
};

Can we do this with Node.js somehow? Will be useful for debugging. Especially when servers are loading different files (or in different order) based on configuration.

I assume this might be documented in

https://nodejs.org/api/modules.html

but I am not seeing anything

like image 853
Alexander Mills Avatar asked Oct 14 '16 23:10

Alexander Mills


2 Answers

If you look at the source code for require(), you will find this:

Module._load = function(request, parent, isMain) {
    if (parent) {
        debug('Module._load REQUEST %s parent: %s', request, parent.id);
    }

This shows that you can leverage the debug() call to get the information you need. In order to do this, you will notice that module is setup using util.debuglog('module'). This means that you need to run your application with with the NODE_DEBUG variable set to module. You can do it the following way from the console:

NODE_DEBUG=module node main.js

This will log what you are looking for.

like image 98
Matt Way Avatar answered Nov 02 '22 17:11

Matt Way


I'm not aware of a documented callback API for the purpose of module load callbacks (although a logging mechanism for module loading appears to exist).

Here's a quick workaround to the apparent lack of such a callback, by monkeypatching Module._load:

const Module = require('module');
const originalModuleLoad = Module._load;
Module._load = function() {
    originalModuleLoad.apply(this, arguments);
    console.log("Loaded with arguments " + JSON.stringify(arguments));
}

I executed the above code in a REPL and then did require('assert'). Lo and behold:

> require('assert')
Loading with arguments {"0":"assert","1":{"id":"<repl>","exports":{},"filename":null,"loaded":false,"children":[],"paths":["/Users/mz2/Projects/manuscripts-endnote-promo/repl/node_modules","/Users/mz2/Projects/manuscripts-endnote-promo/node_modules","/Users/mz2/Projects/node_modules","/Users/mz2/node_modules","/Users/node_modules","/Users/mz2/.nvm-fish/v6.1.0/lib/node_modules","/Users/mz2/.node_modules","/Users/mz2/.node_libraries","/Users/mz2/.nvm-fish/v6.1.0/lib/node"]},"2":false}

Please don't think about using code like above for anything but debug only purposes.

like image 26
mz2 Avatar answered Nov 02 '22 16:11

mz2