Javascript 模块deps can';t解析相对要求()s

Javascript 模块deps can';t解析相对要求()s,javascript,node.js,node-modules,Javascript,Node.js,Node Modules,我正在尝试使用遍历Node.js文件的依赖关系图。这里是一个基本上最小的测试用例(请参见下面的绝对最小值): 出于某种原因,这会导致错误事件:错误:无法从“/Users/alex/Development/audittool/node_modules/resolve/index.js”找到模块“/lib/core” 我一辈子都搞不清楚发生了什么事。我甚至修补了模块deps,以转储它提供给resolve的参数,这样我就可以重现它正在进行的确切函数调用。手动为resolve提供几乎完全相同的参数可以得

我正在尝试使用遍历Node.js文件的依赖关系图。这里是一个基本上最小的测试用例(请参见下面的绝对最小值):

出于某种原因,这会导致错误事件:
错误:无法从“/Users/alex/Development/audittool/node_modules/resolve/index.js”找到模块“/lib/core”

我一辈子都搞不清楚发生了什么事。我甚至修补了
模块deps
,以转储它提供给
resolve
的参数,这样我就可以重现它正在进行的确切函数调用。手动为
resolve
提供几乎完全相同的参数可以得到正确的解析

我在谷歌上搜索了很多,但还是找不到任何东西


下面是一个更简单的测试用例:

test.js

require('./test2.js');
var resolve = require('resolve'),
    mdeps = require('module-deps'),
    through2 = require('through2');

var md = mdeps({
        resolve: resolve
});

md.end(require.resolve('./test.js'));
var basedir = opts.basedir || path.dirname(caller());
test2.js
:(空)

test3.js

require('./test2.js');
var resolve = require('resolve'),
    mdeps = require('module-deps'),
    through2 = require('through2');

var md = mdeps({
        resolve: resolve
});

md.end(require.resolve('./test.js'));
var basedir = opts.basedir || path.dirname(caller());
为了测试
module deps
正在进行的调用,我在第180行编辑了
node_modules/module deps/index.js以添加:

console.log('EQL', self.resolver === require('/Users/alex/Development/audittool/node_modules/resolve/index.js'));
console.log('RESOLVER', id, parent);
    self.resolver(id, parent, function onresolve (err, file, pkg, fakePath) {
        ...
self.resolver
行用于上下文。运行
test3.js
打印:

EQL true
RESOLVER /Users/alex/Development/audittool/test.js { id: '/Users/alex/Development/audittool/__fake.js',
  filename: '/Users/alex/Development/audittool/_fake.js',
  paths: [],
  basedir: '/Users/alex/Development/audittool',
  packageFilter: [Function],
  modules: {} }
EQL true
RESOLVER ./test2.js { id: '/Users/alex/Development/audittool/test.js',
  filename: '/Users/alex/Development/audittool/test.js',
  paths: [],
  package: { __dirname: '/Users/alex/Development/audittool' },
  inNodeModules: false,
  packageFilter: [Function],
  modules: {} }
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: Cannot find module './test2.js' from '/Users/alex/Development/audittool/test.js'
    at /Users/alex/Development/audittool/node_modules/resolve/lib/async.js:64:35
    at load (/Users/alex/Development/audittool/node_modules/resolve/lib/async.js:83:43)
    at onex (/Users/alex/Development/audittool/node_modules/resolve/lib/async.js:108:17)
    at /Users/alex/Development/audittool/node_modules/resolve/lib/async.js:12:69
    at FSReqWrap.oncomplete (fs.js:152:21)
基于该转储,我创建了
resolve_test3.js
来尝试并重新创建
模块deps
调用:

var resolve = require('resolve');
resolve('./test2.js', {
    id: '/Users/alex/Development/audittool/test.js',
    filename: '/Users/alex/Development/audittool/test.js',
    paths: [],
    package: { __dirname: '/Users/alex/Development/audittool' },
    inNodeModules: false,
    modules: {}
}, console.log);
但它成功运行并打印:

null '/Users/alex/Development/audittool/test2.js' { __dirname: '/Users/alex/Development/audittool' }
在AICT中,两个调用之间唯一的区别是第一个调用定义了
opts.packageFilter


经过一些进一步的检测工作后,我认为问题在于
模块deps
没有正确地将
opts.basedir
传递到
解析
。我插入了
if(parent.package)parent.basedir=parent.package.\uu dirname
模块deps
index.js
第169行之后(即,如果(opts.modules)parent.modules=opts.modules;
,则读取
的行),并修复了问题

我认为,
require_test3.js
起作用的原因是因为
node\u modules/resolve/lib/async.js
中的第35行:

require('./test2.js');
var resolve = require('resolve'),
    mdeps = require('module-deps'),
    through2 = require('through2');

var md = mdeps({
        resolve: resolve
});

md.end(require.resolve('./test.js'));
var basedir = opts.basedir || path.dirname(caller());

注意
caller()
。因为
resolve\u test3.js
是从它工作的同一个目录调用
resolve
,但是
module deps
是从
node\u modules
内部调用它的,所以它得到了一个不正确的
basename。

我调试了它,我发现它与解析模块的工作方式有关。如果您可以调试它,并在fs.js模块中看到它试图在写入流后加载模块,那么它有一个错误列表:

“enoint:没有这样的文件或目录,stat'//node\u modules/module deps/node\u modules/module deps'

“enoint:没有这样的文件或目录,stat'/node\u modules/module deps/node\u modules/builtins'

“enoint:没有这样的文件或目录,stat'/Users/luvkarakoti/Desktop/dos2 UNIX/lf crlf/node_modules/module deps/node_modules/through2'

(请注意,这些模块正是您在触发并随后读取的文件中导入的模块)


如您所见,它正试图在
模块deps
中查找
节点模块
,而它应该在
/node\u模块
中搜索这些模块。也许您可以更正它的解析方式,从而使它指向
而不是
/node\u modules/module deps

使用常规节点解析算法而不是浏览器解析所做的任何操作-似乎这是
解析
的问题,而不是
模块deps
的问题。手动提供几乎完全相同的参数以进行解析,从而得到正确的解析结果-请将其显示以供比较。这两种情况都是可取的。@estus你是对的,对不起。那是凌晨3点,我感到沮丧和懒惰:P