Node.js监听模块加载

时间:2016-10-14 23:32:52

标签: javascript node.js

在前端使用RequireJS,我们可以使用以下方式监听模块何时加载到运行时模块缓存中:

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

我们可以用Node.js做某事吗?对调试很有用。特别是当服务器根据配置加载不同的文件(或以不同的顺序)时。

我认为这可能会记录在

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

但我没有看到任何东西

3 个答案:

答案 0 :(得分:4)

如果您查看require()的{​​{3}},您会发现:

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

这表明您可以利用debug()调用来获取所需的信息。为此,您会注意到使用util.debuglog('module')设置了模块。这意味着您需要在NODE_DEBUG变量设置为module的情况下运行您的应用程序。您可以通过以下方式从控制台执行此操作:

NODE_DEBUG=module node main.js

这将记录您要查找的内容。

答案 1 :(得分:1)

因为node.js模块是同步导入的(必需的),所以只需要使用require语句即可导入模块。

虽然RequireJS可以异步导入模块,但偶数监听是一项重要功能,但Node.js中的本机要求将这种必要性排除在外。这样,你可能知道:

const module = require('module')
// You can use the module here, async or sync.

除此之外,不仅要求同步,而且为了使用模块,必须在使用它的同一文件中明确要求它。这可以通过多种方式绕过,但最佳做法是要求您使用模块的每个模块。

对于需要异步初始化的特定模块,模块应该提供事件,或者您可以使用promise或回调来包装init函数。例如,使用promise:

const module = require('module')
// Create a promise to initialize the module inside it:
const initialized = new Promise((resolve, reject) => {
    // Init module inside the promise:
    module.init((error) => {
        if(error){
            return reject(error)
        }
        // Resolve will indicate successful init:
        resolve()
    })
})

// Now with wrapped init, proceed when done:
initialized
    .then(() => {
        // Module is initialized, do what you need.
    })
    .catch(error => {
        // Handle init error.
    })

答案 2 :(得分:1)

我不知道用于模块加载回调(although a logging mechanism for module loading appears to exist)的文档回调API。

通过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));
}

我在REPL中执行了上面的代码然后执行了require('assert')。罗,看哪:

> 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}

请不要考虑使用上述代码进行任何操作,只能进行调试。