向下遍历 Webpack 模块树的最佳方式

Best way to traverse Webpack modules tree downwards

我正在做一些与 Webpack 相关的项目,我需要在其中分析整个模块树。

目前我正在向上遍历,使用 module.reasons 属性,其中包含当前模块的所有父模块。但是,我找不到包含子模块的模拟 属性。

我的遍历算法基于 Webpack 的 Module class,因为它应该能够对任何类型的模块执行递归。 (任何其他 class 扩展 Module 的所有模块实例)

测试时,我看到 module.dependencies 属性,但它没有在 Module 构造函数中定义,我找不到它是如何填充的。

知道如何向下遍历吗?我还缺少其他 属性 吗?或者我应该使用不同的 Webpack 接口而不是直接从 Module 个实例内部访问树?

更新:

我正在使用 module.dependencies 因为我已经确认它以某种方式存在于每个模块中。但是,它只列出静态依赖项(例如:import {something} from 'some/module.js'),而不是像(import('some/module.js'))这样的动态依赖项(即使可解析)。任何帮助将不胜感激。谢谢。

进一步分析 Webpack 的源代码后,我发现 module.blocks 属性 为模块中每个已解析的 'internal dependency block' (内部声明和赋值)保存了一个引用,包括动态 import() 语句。

module.blocksblock 个对象的数组。每个块都有一个 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.