我正在与Webpack相关的一些项目中,我需要分析整个模块树。
当前,我正在使用module.reasons
属性向上遍历,该属性具有作为当前模块父级的所有模块。但是,我找不到包含子模块的类比属性。
我将遍历算法基于Webpack的Module
类,因为它应该能够对任何类型的模块执行递归。 (任何其他扩展了Module
的类的所有模块实例)
[在测试时,我看到了一个module.dependencies
属性,但未在Module
构造函数中定义,并且我找不到它的填充方式。
关于如何向下移动的任何想法?我还有其他财产吗?还是应该使用其他Webpack界面而不是直接从Module
实例内部访问树?
UPDATE:
我正在使用module.dependencies
,因为我已经确认每个模块上都存在它。但是,它仅列出静态依赖关系(EX:import {something} from 'some/module.js'
),而不列出诸如(import('some/module.js')
)之类的动态依赖关系(即使是可解决的)。任何帮助将不胜感激。谢谢。
[进一步分析Webpack的源代码后,我发现module.blocks
属性为模块内部的每个已解析“内部依赖块”(内部声明和赋值)(包括动态import()
语句)都提供了引用。
module.blocks
是block
对象的数组。每个块都有一个block.dependencies
属性,该属性是dependency
对象的数组。
您对作为dependency
实例的ImportDependency
对象感兴趣。
类似这样的东西:
function getAllChildModules(module) {
const childModules = [];
// GET STATIC CHILD MODULES
module.dependencies.forEach((dep) => {
childModules.push(dep.module);
});
// GET DYNAMIC CHILD MODULES
module.blocks.forEach((blk) => {
blk.dependencies.forEach((dep) => {
if (dep.constructor.name === 'ImportDependency') {
childModules.push(dep.module);
}
});
});
return childModules;
}
确认here。