Javascript 模块deps can';t解析相对要求()s
我正在尝试使用遍历Node.js文件的依赖关系图。这里是一个基本上最小的测试用例(请参见下面的绝对最小值): 出于某种原因,这会导致错误事件: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提供几乎完全相同的参数可以得
错误:无法从“/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