@@ -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