Лучший способ пройти вниз по дереву модулей Webpack вниз - PullRequest
0 голосов
/ 30 марта 2020

Я работаю над некоторыми проектами, связанными с Webpack, в которых мне нужно проанализировать все дерево модулей.

В настоящее время я иду вверх, используя свойство module.reasons, в котором есть все модули, которые родители текущего модуля. Однако я не могу найти аналоговое свойство, содержащее дочерние модули.

Я основываю алгоритм обхода на классе Module Webpack, потому что он должен быть в состоянии выполнить рекурсию для любого типа модуля. (Все экземпляры модулей любого другого класса, расширяющие Module)

Во время тестирования я видел свойство module.dependencies, но оно не определено в конструкторе Module, и я не смог найти, как оно заполняется .

Есть идеи о том, как я могу пройти вниз? Есть ли какое-то другое свойство, которое мне не хватает? Или я должен получить доступ к дереву, используя другой интерфейс Webpack, а не непосредственно из Module экземпляров?

ОБНОВЛЕНИЕ:

Я используя module.dependencies, потому что я подтвердил, что так или иначе он присутствует на каждом модуле. Однако в нем перечислены только зависимости c (например: import {something} from 'some/module.js'), но не динамические c (даже если разрешаемые), такие как (import('some/module.js')). Любая помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

После дальнейшего анализа исходного кода Webpack я обнаружил, что свойство module.blocks содержит ссылку на каждый проанализированный «внутренний блок зависимостей» (внутренние объявления и присваивания) внутри модуля, включая динамические c 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;
}

Подтверждение здесь .

...