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 编译钩子访问预密封的依赖树。
我们怎么知道?
由于 webpack 钩子文档非常少(至少可以这么说),我们必须阅读 webpack 源代码以确保它是我们正在寻找的:
编译器在密封依赖树之前做的最后一件事就是“完成”它。
完成依赖树为编译提供了一个钩子。
代码示例
我们创建了一个名为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!
})
}
}
现在我们点击compilation的finishModules钩子:
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 参数是一组 webpack 模块及其依赖项以及基本上所有其他可用数据。
最后但同样重要的是,我们需要将插件添加到我们的 webpack 配置中:
module.exports = {
plugins: [
new AccessDependenciesPlugin()
]
}
我们完成了。 ?
希望这会有所帮助。
奖励内容:webpack 3
根据 cmets 中的请求:这是 webpack 3 遗留插件系统的 AccessDependenciesPlugin 版本。
class AccessDependenciesPlugin {
apply (compiler) {
compiler.plugin('compilation', compilation => {
compilation.plugin('finish-modules', modules => {
/*
|---------------------------------------------------
| Here we go, `modules` is what we're looking for!
|---------------------------------------------------
*/
})
})
}
}