Skip to content

Commit cc705ec

Browse files
committed
avoid creating recursive chunk references
parent-child-dependencies are more optimized
1 parent e610b65 commit cc705ec

1 file changed

Lines changed: 68 additions & 10 deletions

File tree

lib/Compilation.js

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,11 @@ class Compilation extends Tapable {
830830
}
831831
}
832832

833-
processDependenciesBlockForChunk(block, chunk) {
833+
processDependenciesBlockForChunk(module, chunk) {
834+
let block = module;
835+
const initialChunk = chunk;
836+
const chunkDependencies = new Map(); // Map<Chunk, Array<{Module, Chunk}>>
837+
834838
const iteratorBlock = b => {
835839
let c;
836840
if(!b.chunks) {
@@ -840,9 +844,17 @@ class Compilation extends Tapable {
840844
} else {
841845
c = b.chunks[0];
842846
}
843-
chunk.addChunk(c);
844-
c.addParent(chunk);
845-
queue.push([b, c]);
847+
let deps = chunkDependencies.get(chunk);
848+
if(!deps) chunkDependencies.set(chunk, deps = []);
849+
deps.push({
850+
chunk: c,
851+
module
852+
});
853+
queue.push({
854+
block: b,
855+
module: null,
856+
chunk: c
857+
});
846858
};
847859

848860
const iteratorDependency = d => {
@@ -854,18 +866,25 @@ class Compilation extends Tapable {
854866
}
855867
if(chunk.addModule(d.module)) {
856868
d.module.addChunk(chunk);
857-
queue.push([d.module, chunk]);
869+
queue.push({
870+
block: d.module,
871+
module: d.module,
872+
chunk
873+
});
858874
}
859875
};
860876

861-
const queue = [
862-
[block, chunk]
863-
];
877+
const queue = [{
878+
block,
879+
module,
880+
chunk
881+
}];
864882

865883
while(queue.length) {
866884
const queueItem = queue.pop();
867-
block = queueItem[0];
868-
chunk = queueItem[1];
885+
block = queueItem.block;
886+
module = queueItem.module;
887+
chunk = queueItem.chunk;
869888

870889
if(block.variables) {
871890
iterationBlockVariable(block.variables, iteratorDependency);
@@ -879,6 +898,45 @@ class Compilation extends Tapable {
879898
iterationOfArrayCallback(block.blocks, iteratorBlock);
880899
}
881900
}
901+
902+
chunk = initialChunk;
903+
let chunks = new Set();
904+
const queue2 = [{
905+
chunk,
906+
chunks
907+
}];
908+
909+
while(queue2.length) {
910+
const queueItem = queue2.pop();
911+
chunk = queueItem.chunk;
912+
chunks = queueItem.chunks;
913+
914+
const deps = chunkDependencies.get(chunk);
915+
if(!deps) continue;
916+
917+
const depsFiltered = deps.filter(dep => {
918+
if(chunks.has(dep.chunk)) return false;
919+
for(const chunk of chunks) {
920+
if(chunk.containsModule(dep.module))
921+
return false;
922+
}
923+
return true;
924+
});
925+
926+
for(let i = 0; i < depsFiltered.length; i++) {
927+
const dep = depsFiltered[i];
928+
const depChunk = dep.chunk;
929+
chunk.addChunk(depChunk);
930+
depChunk.addParent(chunk);
931+
932+
const newChunks = depsFiltered.length > 1 ? new Set(chunks) : chunks;
933+
newChunks.add(chunk);
934+
queue2.push({
935+
chunk: depChunk,
936+
chunks: newChunks
937+
});
938+
}
939+
}
882940
}
883941

884942
removeChunkFromDependencies(block, chunk) {

0 commit comments

Comments
 (0)