@@ -1168,6 +1168,61 @@ class Compilation extends Tapable {
1168
1168
const chunkDependencies = new Map ( ) ; // Map<Chunk, Array<{Module, Chunk}>>
1169
1169
const allCreatedChunkGroups = new Set ( ) ;
1170
1170
1171
+ // PREPARE
1172
+ const blockInfoMap = new Map ( ) ;
1173
+
1174
+ const iteratorDependency = d => {
1175
+ // We skip Dependencies without Reference
1176
+ const ref = d . getReference ( ) ;
1177
+ if ( ! ref ) {
1178
+ return ;
1179
+ }
1180
+ // We skip Dependencies without Module pointer
1181
+ const refModule = ref . module ;
1182
+ if ( ! refModule ) {
1183
+ return ;
1184
+ }
1185
+ // We skip weak Dependencies
1186
+ if ( ref . weak ) {
1187
+ return ;
1188
+ }
1189
+
1190
+ blockInfoModules . add ( refModule ) ;
1191
+ } ;
1192
+
1193
+ const iteratorBlockPrepare = b => {
1194
+ blockInfoBlocks . push ( b ) ;
1195
+ blockQueue . push ( b ) ;
1196
+ } ;
1197
+
1198
+ let block , blockQueue , blockInfoModules , blockInfoBlocks ;
1199
+ for ( const module of this . modules ) {
1200
+ blockQueue = [ module ] ;
1201
+ while ( blockQueue . length > 0 ) {
1202
+ block = blockQueue . pop ( ) ;
1203
+ blockInfoModules = new Set ( ) ;
1204
+ blockInfoBlocks = [ ] ;
1205
+
1206
+ if ( block . variables ) {
1207
+ iterationBlockVariable ( block . variables , iteratorDependency ) ;
1208
+ }
1209
+
1210
+ if ( block . dependencies ) {
1211
+ iterationOfArrayCallback ( block . dependencies , iteratorDependency ) ;
1212
+ }
1213
+
1214
+ if ( block . blocks ) {
1215
+ iterationOfArrayCallback ( block . blocks , iteratorBlockPrepare ) ;
1216
+ }
1217
+
1218
+ const blockInfo = {
1219
+ modules : blockInfoModules ,
1220
+ blocks : blockInfoBlocks
1221
+ } ;
1222
+ blockInfoMap . set ( block , blockInfo ) ;
1223
+ }
1224
+ }
1225
+
1171
1226
// PART ONE
1172
1227
1173
1228
const blockChunkGroups = new Map ( ) ;
@@ -1180,7 +1235,7 @@ class Compilation extends Tapable {
1180
1235
chunkGroup
1181
1236
} ) ) ;
1182
1237
1183
- let module , block , chunk , chunkGroup ;
1238
+ let module , chunk , chunkGroup ;
1184
1239
1185
1240
// For each async Block in graph
1186
1241
const iteratorBlock = b => {
@@ -1227,36 +1282,6 @@ class Compilation extends Tapable {
1227
1282
} ) ;
1228
1283
} ;
1229
1284
1230
- // For each Dependency in the graph
1231
- const iteratorDependency = d => {
1232
- // We skip Dependencies without Reference
1233
- const ref = d . getReference ( ) ;
1234
- if ( ! ref ) {
1235
- return ;
1236
- }
1237
- // We skip Dependencies without Module pointer
1238
- const refModule = ref . module ;
1239
- if ( ! refModule ) {
1240
- return ;
1241
- }
1242
- // We skip weak Dependencies
1243
- if ( ref . weak ) {
1244
- return ;
1245
- }
1246
- // We connect Module and Chunk when not already done
1247
- if ( chunk . addModule ( refModule ) ) {
1248
- refModule . addChunk ( chunk ) ;
1249
-
1250
- // And enqueue the Module for traversal
1251
- queue . push ( {
1252
- block : refModule ,
1253
- module : refModule ,
1254
- chunk,
1255
- chunkGroup
1256
- } ) ;
1257
- }
1258
- } ;
1259
-
1260
1285
// Iterative traversal of the Module graph
1261
1286
// Recursive would be simpler to write but could result in Stack Overflows
1262
1287
while ( queue . length ) {
@@ -1266,18 +1291,27 @@ class Compilation extends Tapable {
1266
1291
chunk = queueItem . chunk ;
1267
1292
chunkGroup = queueItem . chunkGroup ;
1268
1293
1269
- // Traverse all variables, Dependencies and Blocks
1270
- if ( block . variables ) {
1271
- iterationBlockVariable ( block . variables , iteratorDependency ) ;
1272
- }
1273
-
1274
- if ( block . dependencies ) {
1275
- iterationOfArrayCallback ( block . dependencies , iteratorDependency ) ;
1294
+ // get prepared block info
1295
+ const blockInfo = blockInfoMap . get ( block ) ;
1296
+
1297
+ // Traverse all referenced modules
1298
+ for ( const refModule of blockInfo . modules ) {
1299
+ // We connect Module and Chunk when not already done
1300
+ if ( chunk . addModule ( refModule ) ) {
1301
+ refModule . addChunk ( chunk ) ;
1302
+
1303
+ // And enqueue the Module for traversal
1304
+ queue . push ( {
1305
+ block : refModule ,
1306
+ module : refModule ,
1307
+ chunk,
1308
+ chunkGroup
1309
+ } ) ;
1310
+ }
1276
1311
}
1277
1312
1278
- if ( block . blocks ) {
1279
- iterationOfArrayCallback ( block . blocks , iteratorBlock ) ;
1280
- }
1313
+ // Traverse all Blocks
1314
+ iterationOfArrayCallback ( blockInfo . blocks , iteratorBlock ) ;
1281
1315
}
1282
1316
1283
1317
// PART TWO
0 commit comments