有没有可能访问Node.js模块中“已加载”的子项?

3
假设我有3个带依赖关系的模块,如下所示:
A.js
var b = require('./B');
var c = require('./C');

console.log(module.children.length); // 2

B.js

var z = require('Z');

console.log(module.children.length); // 1

C.js

var z = require('Z');

console.log(module.children.length); // 0 ?!?!

ZC中的module.children中没有出现,因为它在C被执行之前已被B加载。

我可以理解Zmodule.parentB,因为这是它最初被加载的地方,但是Z肯定可以同时是BC的子项吗?

无论是否已经加载,我的问题是:是否有可能看到一个模块的所有子项?

1个回答

1

我曾经遇到过类似的问题,当时我手动删除了缓存,对于你的情况是模块C。

C.js

delete require.cache[require.resolve('./Z')];
var z = require('./Z'); // 1

虽然我不确定这对您来说是否是可行的解决方案。


1
好主意.. 但我只能更改顶层文件(想象一下:带有 var a = require('./A') 的东西).. 我正在尝试制作一个工具,通过递归查找 module.children 来显示依赖项。 - Alex McMillan
好主意,听起来很有前途 :)。嗯,你是如何访问子模块的?访问之前可以清除缓存吗? - Alan Souza
我正在制作一个单一的脚本文件,它以文件名作为命令行参数,require该文件,然后查看自己的module.children - 唯一的项目是已加载的module。然后通过module.children递归,将一些信息转储到控制台。那就是目标... - Alex McMillan
我明白了,看看rewire。https://github.com/jhnns/rewire。期待听到关于这个脚本的消息 :) - Alan Souza
重连(module.children.id); - Alan Souza
这是我想出来的代码:this。我试着使用rewire,但没有成功。不过,我研究了一下require对象的内容,并找到了一个钩子。我很想知道你的想法。 - Alex McMillan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接