Ответ 1
TL; DR: Да, вы можете получить доступ к дереву зависимостей непосредственно перед его запечатыванием.
Для этого добавьте следующий код в ваш webpack.config.js
:
class AccessDependenciesPlugin {
apply (compiler) {
compiler.hooks.compilation.tap('AccessDependenciesPlugin', compilation => {
compilation.hooks.finishModules.tap('AccessDependenciesPlugin', modules => {
/*
|---------------------------------------------------
| Here we go, 'modules' is what we're looking for!
|---------------------------------------------------
*/
})
})
}
}
module.exports = {
// ...
plugins: [
new AccessDependenciesPlugin()
]
}
Для получения более подробной информации см. Объяснение ниже.
Крюк, который мы ищем
Мы можем получить доступ к предварительно запечатанному дереву зависимостей с помощью finishModules
компиляции finishModules
.
Откуда нам знать?
Поскольку документация о перехвате веб-пакетов очень минимальна (мягко говоря), нам пришлось прочитать исходный код веб-пакета, чтобы убедиться, что это то, что мы ищем:
Последнее, что делает компилятор перед закрытием дерева зависимостей, - это "заканчивает" его.
- Это происходит в Compiler.js, строка 492
Завершение дерева зависимостей предлагает крючок для компиляции.
-
finishModules
в документах веб-пакета - Хук вызывается в
Compilation.js
, строка 828
Пример кода
Мы создаем плагин с именем AccessDependenciesPlugin
:
// Basic webpack plugin structure
class AccessDependenciesPlugin {
apply (compiler) {
}
}
Чтобы использовать хук компиляции, нам нужно сначала получить доступ к объекту compilation
. Мы делаем это с помощью compilation
:
class AccessDependenciesPlugin {
apply (compiler) {
compiler.hooks.compilation.tap('AccessDependenciesPlugin', compilation => {
// We have access to the compilation now!
})
}
}
Теперь нажмите на finishModules
крючок compilation
:
class AccessDependenciesPlugin {
apply (compiler) {
compiler.hooks.compilation.tap('AccessDependenciesPlugin', compilation => {
compilation.hooks.finishModules.tap('AccessDependenciesPlugin', modules => {
// Here we go, 'modules' is what we're looking for!
})
})
}
}
Параметр modules
этого хука - это массив модулей веб-пакетов с их зависимостями и, в основном, все остальные доступные о них данные.
И последнее, но не менее важное: нам нужно добавить плагин в нашу конфигурацию веб-пакета:
module.exports = {
plugins: [
new AccessDependenciesPlugin()
]
}
И мы сделали. 🎉
Надеюсь это поможет.
Бонусный контент: webpack 3
По запросу в комментариях: здесь версия AccessDependenciesPlugin
для устаревшей системы плагинов webpack 3.
class AccessDependenciesPlugin {
apply (compiler) {
compiler.plugin('compilation', compilation => {
compilation.plugin('finish-modules', modules => {
/*
|---------------------------------------------------
| Here we go, 'modules' is what we're looking for!
|---------------------------------------------------
*/
})
})
}
}