require.resolve()有效。为什么不module.parent.require.resolve()?

时间:2017-09-21 14:24:17

标签: node.js

我正在尝试查找包含模块的文件。在主模块中,require.resolve('module')很高兴地从模块的package.json中返回main键的值。

但是,我想从通过npm包含的模块中执行此操作。如果我只是调用require.resolve('module'),它会在node_modules中查找此模块,而我需要从正在运行的包的角度来解决它。

根据the docsrequire实际上是module.requiremodule.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(),这是一个非常相似的事情。

1 个答案:

答案 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,那就太好了。