mirror of https://github.com/webpack/webpack.git
				
				
				
			less memory, reduce timing verbosity
This commit is contained in:
		
							parent
							
								
									126fb99121
								
							
						
					
					
						commit
						2e0ce0d1a9
					
				| 
						 | 
					@ -212,8 +212,11 @@ const visitModules = (
 | 
				
			||||||
		.reverse();
 | 
							.reverse();
 | 
				
			||||||
	/** @type {Map<ChunkGroup, Set<ChunkGroup>>} */
 | 
						/** @type {Map<ChunkGroup, Set<ChunkGroup>>} */
 | 
				
			||||||
	const queueConnect = new Map();
 | 
						const queueConnect = new Map();
 | 
				
			||||||
 | 
						/** @type {Set<ChunkGroupInfo>} */
 | 
				
			||||||
 | 
						const outdatedChunkGroupInfo = new Set();
 | 
				
			||||||
	/** @type {QueueItem[]} */
 | 
						/** @type {QueueItem[]} */
 | 
				
			||||||
	let queueDelayed = [];
 | 
						let queueDelayed = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.timeEnd("prepare");
 | 
						logger.timeEnd("prepare");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/** @type {Module} */
 | 
						/** @type {Module} */
 | 
				
			||||||
| 
						 | 
					@ -414,119 +417,122 @@ const visitModules = (
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		logger.timeEnd("visiting");
 | 
							logger.timeEnd("visiting");
 | 
				
			||||||
		logger.time("calculating available modules");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/** @type {Set<ChunkGroupInfo>} */
 | 
							if (queueConnect.size > 0) {
 | 
				
			||||||
		const outdatedChunkGroupInfo = new Set();
 | 
								logger.time("calculating available modules");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Figure out new parents for chunk groups
 | 
								// Figure out new parents for chunk groups
 | 
				
			||||||
		// to get new available modules for these children
 | 
								// to get new available modules for these children
 | 
				
			||||||
		for (const [chunkGroup, targets] of queueConnect) {
 | 
								for (const [chunkGroup, targets] of queueConnect) {
 | 
				
			||||||
			const info = chunkGroupInfoMap.get(chunkGroup);
 | 
									const info = chunkGroupInfoMap.get(chunkGroup);
 | 
				
			||||||
			let minAvailableModules = info.minAvailableModules;
 | 
									let minAvailableModules = info.minAvailableModules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 1. Create a new Set of available modules at this points
 | 
									// 1. Create a new Set of available modules at this points
 | 
				
			||||||
			const resultingAvailableModules = new Set(minAvailableModules);
 | 
									const resultingAvailableModules = new Set(minAvailableModules);
 | 
				
			||||||
			for (const chunk of chunkGroup.chunks) {
 | 
									for (const chunk of chunkGroup.chunks) {
 | 
				
			||||||
				for (const m of chunk.modulesIterable) {
 | 
										for (const m of chunk.modulesIterable) {
 | 
				
			||||||
					resultingAvailableModules.add(m);
 | 
											resultingAvailableModules.add(m);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									info.resultingAvailableModules = resultingAvailableModules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// 2. Update chunk group info
 | 
				
			||||||
 | 
									for (const target of targets) {
 | 
				
			||||||
 | 
										let chunkGroupInfo = chunkGroupInfoMap.get(target);
 | 
				
			||||||
 | 
										if (chunkGroupInfo === undefined) {
 | 
				
			||||||
 | 
											chunkGroupInfo = {
 | 
				
			||||||
 | 
												minAvailableModules: undefined,
 | 
				
			||||||
 | 
												minAvailableModulesOwned: undefined,
 | 
				
			||||||
 | 
												availableModulesToBeMerged: [],
 | 
				
			||||||
 | 
												skippedItems: [],
 | 
				
			||||||
 | 
												resultingAvailableModules: undefined
 | 
				
			||||||
 | 
											};
 | 
				
			||||||
 | 
											chunkGroupInfoMap.set(target, chunkGroupInfo);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										chunkGroupInfo.availableModulesToBeMerged.push(
 | 
				
			||||||
 | 
											resultingAvailableModules
 | 
				
			||||||
 | 
										);
 | 
				
			||||||
 | 
										outdatedChunkGroupInfo.add(chunkGroupInfo);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			info.resultingAvailableModules = resultingAvailableModules;
 | 
								queueConnect.clear();
 | 
				
			||||||
 | 
								logger.timeEnd("calculating available modules");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 2. Update chunk group info
 | 
								if (outdatedChunkGroupInfo.size > 0) {
 | 
				
			||||||
			for (const target of targets) {
 | 
									logger.time("merging available modules");
 | 
				
			||||||
				let chunkGroupInfo = chunkGroupInfoMap.get(target);
 | 
									// Execute the merge
 | 
				
			||||||
				if (chunkGroupInfo === undefined) {
 | 
									for (const info of outdatedChunkGroupInfo) {
 | 
				
			||||||
					chunkGroupInfo = {
 | 
										const availableModulesToBeMerged = info.availableModulesToBeMerged;
 | 
				
			||||||
						minAvailableModules: undefined,
 | 
										let minAvailableModules = info.minAvailableModules;
 | 
				
			||||||
						minAvailableModulesOwned: undefined,
 | 
					 | 
				
			||||||
						availableModulesToBeMerged: [],
 | 
					 | 
				
			||||||
						skippedItems: [],
 | 
					 | 
				
			||||||
						resultingAvailableModules: undefined
 | 
					 | 
				
			||||||
					};
 | 
					 | 
				
			||||||
					chunkGroupInfoMap.set(target, chunkGroupInfo);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				chunkGroupInfo.availableModulesToBeMerged.push(
 | 
					 | 
				
			||||||
					resultingAvailableModules
 | 
					 | 
				
			||||||
				);
 | 
					 | 
				
			||||||
				outdatedChunkGroupInfo.add(chunkGroupInfo);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		queueConnect.clear();
 | 
					 | 
				
			||||||
		logger.timeEnd("calculating available modules");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		logger.time("merging available modules");
 | 
										// 1. Get minimal available modules
 | 
				
			||||||
		// Execute the merge
 | 
										// It doesn't make sense to traverse a chunk again with more available modules.
 | 
				
			||||||
		for (const info of outdatedChunkGroupInfo) {
 | 
										// This step calculates the minimal available modules and skips traversal when
 | 
				
			||||||
			const availableModulesToBeMerged = info.availableModulesToBeMerged;
 | 
										// the list didn't shrink.
 | 
				
			||||||
			let minAvailableModules = info.minAvailableModules;
 | 
										if (availableModulesToBeMerged.length > 1) {
 | 
				
			||||||
 | 
											availableModulesToBeMerged.sort(bySetSize);
 | 
				
			||||||
			// 1. Get minimal available modules
 | 
										}
 | 
				
			||||||
			// It doesn't make sense to traverse a chunk again with more available modules.
 | 
										let changed = false;
 | 
				
			||||||
			// This step calculates the minimal available modules and skips traversal when
 | 
										for (const availableModules of availableModulesToBeMerged) {
 | 
				
			||||||
			// the list didn't shrink.
 | 
											if (minAvailableModules === undefined) {
 | 
				
			||||||
			if (availableModulesToBeMerged.length > 1) {
 | 
												minAvailableModules = availableModules;
 | 
				
			||||||
				availableModulesToBeMerged.sort(bySetSize);
 | 
												info.minAvailableModules = minAvailableModules;
 | 
				
			||||||
			}
 | 
												info.minAvailableModulesOwned = false;
 | 
				
			||||||
			let changed = false;
 | 
												changed = true;
 | 
				
			||||||
			for (const availableModules of availableModulesToBeMerged) {
 | 
											} else {
 | 
				
			||||||
				if (minAvailableModules === undefined) {
 | 
												if (info.minAvailableModulesOwned) {
 | 
				
			||||||
					minAvailableModules = availableModules;
 | 
													// We own it and can modify it
 | 
				
			||||||
					info.minAvailableModules = minAvailableModules;
 | 
													for (const m of minAvailableModules) {
 | 
				
			||||||
					info.minAvailableModulesOwned = false;
 | 
														if (!availableModules.has(m)) {
 | 
				
			||||||
					changed = true;
 | 
															minAvailableModules.delete(m);
 | 
				
			||||||
				} else {
 | 
															changed = true;
 | 
				
			||||||
					if (info.minAvailableModulesOwned) {
 | 
														}
 | 
				
			||||||
						// We own it and can modify it
 | 
													}
 | 
				
			||||||
						for (const m of minAvailableModules) {
 | 
												} else {
 | 
				
			||||||
							if (!availableModules.has(m)) {
 | 
													for (const m of minAvailableModules) {
 | 
				
			||||||
								minAvailableModules.delete(m);
 | 
														if (!availableModules.has(m)) {
 | 
				
			||||||
								changed = true;
 | 
															// minAvailableModules need to be modified
 | 
				
			||||||
							}
 | 
															// but we don't own it
 | 
				
			||||||
						}
 | 
															// construct a new Set as intersection of minAvailableModules and availableModules
 | 
				
			||||||
					} else {
 | 
															/** @type {Set<Module>} */
 | 
				
			||||||
						for (const m of minAvailableModules) {
 | 
															const newSet = new Set();
 | 
				
			||||||
							if (!availableModules.has(m)) {
 | 
															const iterator = minAvailableModules[Symbol.iterator]();
 | 
				
			||||||
								// minAvailableModules need to be modified
 | 
															/** @type {IteratorResult<Module>} */
 | 
				
			||||||
								// but we don't own it
 | 
															let it;
 | 
				
			||||||
								// construct a new Set as intersection of minAvailableModules and availableModules
 | 
															while (!(it = iterator.next()).done) {
 | 
				
			||||||
								/** @type {Set<Module>} */
 | 
																const module = it.value;
 | 
				
			||||||
								const newSet = new Set();
 | 
																if (module === m) break;
 | 
				
			||||||
								const iterator = minAvailableModules[Symbol.iterator]();
 | 
																newSet.add(module);
 | 
				
			||||||
								/** @type {IteratorResult<Module>} */
 | 
															}
 | 
				
			||||||
								let it;
 | 
															while (!(it = iterator.next()).done) {
 | 
				
			||||||
								while (!(it = iterator.next()).done) {
 | 
																const module = it.value;
 | 
				
			||||||
									const module = it.value;
 | 
																if (availableModules.has(module)) {
 | 
				
			||||||
									if (module === m) break;
 | 
																	newSet.add(module);
 | 
				
			||||||
									newSet.add(module);
 | 
																}
 | 
				
			||||||
								}
 | 
															}
 | 
				
			||||||
								while (!(it = iterator.next()).done) {
 | 
															minAvailableModules = newSet;
 | 
				
			||||||
									const module = it.value;
 | 
															info.minAvailableModulesOwned = true;
 | 
				
			||||||
									if (availableModules.has(module)) {
 | 
															info.minAvailableModules = newSet;
 | 
				
			||||||
										newSet.add(module);
 | 
															changed = true;
 | 
				
			||||||
 | 
															break;
 | 
				
			||||||
									}
 | 
														}
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
								minAvailableModules = newSet;
 | 
					 | 
				
			||||||
								info.minAvailableModulesOwned = true;
 | 
					 | 
				
			||||||
								info.minAvailableModules = newSet;
 | 
					 | 
				
			||||||
								changed = true;
 | 
					 | 
				
			||||||
								break;
 | 
					 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
										availableModulesToBeMerged.length = 0;
 | 
				
			||||||
			}
 | 
										if (!changed) continue;
 | 
				
			||||||
			availableModulesToBeMerged.length = 0;
 | 
					 | 
				
			||||||
			if (!changed) continue;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 2. Reconsider skipped items
 | 
										// 2. Reconsider skipped items
 | 
				
			||||||
			for (const queueItem of info.skippedItems) {
 | 
										for (const queueItem of info.skippedItems) {
 | 
				
			||||||
				queue.push(queueItem);
 | 
											queue.push(queueItem);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										info.skippedItems.length = 0;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									outdatedChunkGroupInfo.clear();
 | 
				
			||||||
 | 
									logger.timeEnd("merging available modules");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			info.skippedItems.length = 0;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		logger.timeEnd("merging available modules");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Run queueDelayed when all items of the queue are processed
 | 
							// Run queueDelayed when all items of the queue are processed
 | 
				
			||||||
		// This is important to get the global indicing correct
 | 
							// This is important to get the global indicing correct
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue