在前端使用RequireJS,我们可以使用以下方式监听模块何时加载到运行时模块缓存中:
requirejs.onResourceLoad = function (context, map, depArray) {
console.log('onResourceLoad>>>', 'map.id:', map.id, 'context:', context);
};
我们可以用Node.js做某事吗?对调试很有用。特别是当服务器根据配置加载不同的文件(或以不同的顺序)时。
我认为这可能会记录在
中https://nodejs.org/api/modules.html
但我没有看到任何东西
答案 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}
请不要考虑使用上述代码进行任何操作,只能进行调试。