我正在尝试查找包含模块的文件。在主模块中,require.resolve('module')
很高兴地从模块的package.json中返回main
键的值。
但是,我想从通过npm包含的模块中执行此操作。如果我只是调用require.resolve('module')
,它会在node_modules中查找此模块,而我需要从正在运行的包的角度来解决它。
根据the docs,require
实际上是module.require
而module.parent
会返回首先需要此模块的模块。为什么module.parent.require.resolve('module')
不起作用?我得到了一个
错误:
TypeError: module.parent.require.resolve is not a function
奇怪的是,console.log module.parent.require.toString()
返回
function (path) {
assert(path, 'missing path');
assert(typeof path === 'string', 'path must be a string');
return Module._load(path, this, /* isMain */ false);
}
所以它对我来说当然是一个功能。
任何人都知道发生了什么事吗?我也尝试了require.main.require.resolve()
,这是一个非常相似的事情。
答案 0 :(得分:1)
TypeError: module.parent.require.resolve is not a function
奇怪的是,
console.log module.parent.require.toString()
返回......
module.parent.require
是一个函数,module.parent.require.resolve
不是。
resolve()
不是函数?似乎require()
和module.require()
不一样:
console.log(require === module.require); // false
对于好奇:
console.log(module.require.toString())
function (path) {
assert(path, 'missing path');
assert(typeof path === 'string', 'path must be a string');
return Module._load(path, this, /* isMain */ false);
}
console.log(require.toString())
function require(path) {
try {
exports.requireDepth += 1;
return mod.require(path);
} finally {
exports.requireDepth -= 1;
}
}
所以require()
调用module.require()
,但不是一回事。
resolve()
怎么样?我们知道require.resolve
是一个功能:
console.log(require.resolve.toString())
function resolve(request) {
return Module._resolveFilename(request, mod);
}
但module.require.resolve
不是:
console.log(module.require.resolve)
undefined
所以不幸的是,resolve()
仅在require.resolve()
处可用,而不是module.require.resolve()
(或module.parent.require.resolve()
就此而言)。
不是一个很好的解决方案,但您可以尝试手动调用Module._resolveFilename()
并传入父模块而不是当前模块:
const Module = module.constructor;
const fileName = Module._resolveFilename('module', module.parent);
此解决方案并不是很好,因为它依赖于可能在将来发生变化的内部API函数。如果NodeJS能为模块加载/解析提供更好的文档和API,那就太好了。