@zohodesk/client_build_tool
Version:
A CLI tool to build web applications and client libraries
49 lines (39 loc) • 1.68 kB
JavaScript
;
const {
RawSource
} = require('webpack-sources');
class InjectChunkGraphPlugin {
constructor(resourceHints) {
this.chunkNames = resourceHints.PreloadChunkNames || [];
}
apply(compiler) {
compiler.hooks.thisCompilation.tap('InjectChunkGraphPlugin', compilation => {
compilation.hooks.processAssets.tap({
name: 'InjectChunkGraphPlugin',
stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS
}, () => {
const stats = compilation.getStats().toJson({
all: true
});
const chunkGraph = {};
this.chunkNames.forEach(chunkName => {
const chunkGroup = stats.namedChunkGroups?.[chunkName];
if (!chunkGroup) {
compilation.warnings.push(new Error(`[InjectChunkGraphPlugin] Chunk group "${chunkName}" not found.`));
return;
}
chunkGraph[chunkName] = chunkGroup.chunks;
}); // Find runtime chunk file
const runtimeChunk = stats.chunks.find(chunk => chunk.names?.some(n => n.includes('runtime~main')));
const runtimeChunkName = runtimeChunk.files[0];
const originalSource = compilation.assets[runtimeChunkName].source();
const newSource = originalSource.replace('__PRELOAD_CHUNK_GRAPH__', `${JSON.stringify(chunkGraph)}`); // Update the runtime asset with injected code
compilation.updateAsset(runtimeChunkName, new RawSource(newSource));
if (runtimeChunkName.includes('smap/')) {
compilation.updateAsset(runtimeChunkName.replace('smap/', ''), new RawSource(newSource));
}
});
});
}
}
module.exports = InjectChunkGraphPlugin;