| 
									
										
										
										
											2018-07-09 20:31:29 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const validateOptions = require("schema-utils"); | 
					
						
							|  |  |  | const schema = require("../../schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 16:13:55 +08:00
										 |  |  | /** @typedef {import("../../declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin").OccurrenceOrderChunkIdsPluginOptions} OccurrenceOrderChunkIdsPluginOptions */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 20:31:29 +08:00
										 |  |  | class OccurrenceOrderChunkIdsPlugin { | 
					
						
							| 
									
										
										
										
											2018-09-20 16:13:55 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {OccurrenceOrderChunkIdsPluginOptions=} options options object | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-07-09 20:31:29 +08:00
										 |  |  | 	constructor(options = {}) { | 
					
						
							|  |  |  | 		validateOptions(schema, options, "Occurrence Order Chunk Ids Plugin"); | 
					
						
							|  |  |  | 		this.options = options; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		const prioritiseInitial = this.options.prioritiseInitial; | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							|  |  |  | 			"OccurrenceOrderChunkIdsPlugin", | 
					
						
							|  |  |  | 			compilation => { | 
					
						
							|  |  |  | 				compilation.hooks.optimizeChunkOrder.tap( | 
					
						
							|  |  |  | 					"OccurrenceOrderChunkIdsPlugin", | 
					
						
							|  |  |  | 					chunks => { | 
					
						
							|  |  |  | 						const occursInInitialChunksMap = new Map(); | 
					
						
							|  |  |  | 						const originalOrder = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						let i = 0; | 
					
						
							|  |  |  | 						for (const c of chunks) { | 
					
						
							|  |  |  | 							let occurs = 0; | 
					
						
							|  |  |  | 							for (const chunkGroup of c.groupsIterable) { | 
					
						
							|  |  |  | 								for (const parent of chunkGroup.parentsIterable) { | 
					
						
							|  |  |  | 									if (parent.isInitial()) occurs++; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							occursInInitialChunksMap.set(c, occurs); | 
					
						
							|  |  |  | 							originalOrder.set(c, i++); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						chunks.sort((a, b) => { | 
					
						
							|  |  |  | 							if (prioritiseInitial) { | 
					
						
							|  |  |  | 								const aEntryOccurs = occursInInitialChunksMap.get(a); | 
					
						
							|  |  |  | 								const bEntryOccurs = occursInInitialChunksMap.get(b); | 
					
						
							|  |  |  | 								if (aEntryOccurs > bEntryOccurs) return -1; | 
					
						
							|  |  |  | 								if (aEntryOccurs < bEntryOccurs) return 1; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							const aOccurs = a.getNumberOfGroups(); | 
					
						
							|  |  |  | 							const bOccurs = b.getNumberOfGroups(); | 
					
						
							|  |  |  | 							if (aOccurs > bOccurs) return -1; | 
					
						
							|  |  |  | 							if (aOccurs < bOccurs) return 1; | 
					
						
							|  |  |  | 							const orgA = originalOrder.get(a); | 
					
						
							|  |  |  | 							const orgB = originalOrder.get(b); | 
					
						
							| 
									
										
										
										
											2018-07-13 21:37:06 +08:00
										 |  |  | 							return orgA - orgB; | 
					
						
							| 
									
										
										
										
											2018-07-09 20:31:29 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = OccurrenceOrderChunkIdsPlugin; |