Javascript 获取节点中模块的路径(模块文件夹,而不是条目文件)

Javascript 获取节点中模块的路径(模块文件夹,而不是条目文件),javascript,node.js,Javascript,Node.js,我希望能够在构建时在节点中查找模块的路径 我在文档中看到有require。像这样解决 // get path to module 'foo' console.log(require.resolve('foo')); 但这会查找模块入口点的路径。如果模块没有入口点(它只是共享文件的集合),则require.resolve将失败 我知道在某些情况下,我可以只查看node\u modules/name of module,但在各种情况下,这都是错误的。例如,我将“foo”作为依赖项,将“foo”作为

我希望能够在构建时在节点中查找模块的路径

我在文档中看到有
require。像这样解决

// get path to module 'foo'
console.log(require.resolve('foo'));
但这会查找模块入口点的路径。如果模块没有入口点(它只是共享文件的集合),则
require.resolve
将失败

我知道在某些情况下,我可以只查看
node\u modules/name of module
,但在各种情况下,这都是错误的。例如,我将“foo”作为依赖项,将“foo”作为“bar”作为依赖项。默认情况下,条形图将位于
项目根/节点\模块/bar
中,但如果I
npm link
“foo”,则“bar”将位于
项目根/节点\模块/foo(link)/节点\模块/bar中

我曾考虑过设置一个虚拟条目,它对我自己的模块有效,但对我无法控制的模块无效

有没有办法找到给定模块根文件夹的路径

还有一种方法可以从其他模块的上下文中获取模块的路径

换句话说,如果我这样做的话

const bar = require('bar');
这将得到mypackage.json中引用的“bar”模块。想象一下,有另一个包“foo”包含不同版本的“bar”。我希望能够问“对于'bar',包'foo'将得到什么路径?”

我试图解决的实际问题是在构建时将一些文件从某个模块复制到构建的输出文件夹中,但要做到这一点,我需要能够找到该模块


我可以一起破解一些东西,但如果他们的方法是正确的,那么用“正确”的方法来做就好了。

我想对于直接依赖,我可以这样做

const path = require('path');
const fs = require('fs');

function exists(filename) {
  try {
    const stat = fs.statSync(filename);
    return true;
  } catch (e) {
    return false;
  }
}

function getModulePath(name) {
  for (const dirname of require.resolve.paths(name)) {
    const filename = path.join(dirname, name);
    if (exists(filename)) {
      return filename;
    }
  }
}


对于间接依赖,我必须让直接依赖进行查找。至少对于问题中提到的
npm链接
案例。

我想对于直接依赖,我可以这样做

const path = require('path');
const fs = require('fs');

function exists(filename) {
  try {
    const stat = fs.statSync(filename);
    return true;
  } catch (e) {
    return false;
  }
}

function getModulePath(name) {
  for (const dirname of require.resolve.paths(name)) {
    const filename = path.join(dirname, name);
    if (exists(filename)) {
      return filename;
    }
  }
}


对于间接依赖,我必须让直接依赖进行查找。至少对于问题中提到的
npm link
案例而言。

我认为这将是关键:

function pathForModuleAsAnotherModule(get, another) {
    let m = require('module')
    let anotherLocation = require.resolve(another);
    let anotherDir = require('path').dirname(anotherLocation);
    let anotherPaths = m.Module._nodeModulePaths(anotherDir)
    return require.resolve(get, { paths: anotherPaths })
}
然后:

pathForModuleAsAnotherModule('foo', 'bar')

我想这会让你觉得很有趣:

function pathForModuleAsAnotherModule(get, another) {
    let m = require('module')
    let anotherLocation = require.resolve(another);
    let anotherDir = require('path').dirname(anotherLocation);
    let anotherPaths = m.Module._nodeModulePaths(anotherDir)
    return require.resolve(get, { paths: anotherPaths })
}
然后:

pathForModuleAsAnotherModule('foo', 'bar')

谢谢,但正如问题
require.resolve(other)
中所指出的,因为它需要一个入口点,所以不可行。您不知道是“节点模块/xxx”(npm)还是“节点模块/aaa/node模块/xxx”(pnpm)还是“/home/user/node模块/xxx”(npm安装xxx,其中包含package.json),谢谢,但正如问题
require.resolve(另一个)
中指出的那样,它不起作用,因为它需要一个入口点。那么它就不可能了。您不知道是“节点模块/xxx”(npm)还是“节点模块/aaa/节点模块/xxx”(pnpm)还是“/home/user/node模块/xxx”(npm安装xxx,其中有package.json)