@zohodesk/client_build_tool
Version:
A CLI tool to build web applications and client libraries
67 lines (52 loc) • 1.85 kB
JavaScript
;
// plugins/ChunkHierarchyPlugin.js
const fs = require('fs');
const path = require('path');
class ChunkHierarchyPlugin {
constructor(outputFile) {
this.outputFile = outputFile || 'chunk-hierarchy-report.json';
}
apply(compiler) {
compiler.hooks.emit.tapAsync('ChunkHierarchyPlugin', (compilation, callback) => {
const result = {};
const rootContext = path.resolve(compiler.context, '..', '..');
for (const chunk of compilation.chunks) {
const chunkName = chunk.name || chunk.id;
const modules = [];
for (const module of compilation.chunkGraph.getChunkModulesIterable(chunk)) {
// Recursively extract real modules (handle ConcatenatedModules)
collectModules(module, modules, rootContext);
}
result[chunkName] = modules;
}
const json = JSON.stringify(result, null, 2);
const outputPath = compiler.outputPath;
const outputFile = path.join(outputPath, this.outputFile);
fs.mkdirSync(outputPath, {
recursive: true
});
fs.writeFileSync(outputFile, json, 'utf-8');
callback();
});
}
}
function collectModules(module, modules, context) {
// Handle normal modules
if (module.resource) {
modules.push(path.relative(context, module.resource));
return;
} // Handle ConcatenatedModule (webpack internal)
if (module.modules) {
for (const innerModule of module.modules) {
collectModules(innerModule, modules, context);
}
} // Handle Webpack 5 internal API (ConcatenatedModule inside _orderedConcatenationList)
if (module._orderedConcatenationList) {
for (const item of module._orderedConcatenationList) {
if (item.module) {
collectModules(item.module, modules, context);
}
}
}
}
module.exports = ChunkHierarchyPlugin;