UNPKG

@zohodesk/client_build_tool

Version:

A CLI tool to build web applications and client libraries

67 lines (52 loc) 1.85 kB
"use strict"; // 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;