2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MIT  License  http : //www.opensource.org/licenses/mit-license.php
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Author  Tobias  Koppers  @ sokra 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								* /  
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"use strict" ;  
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  AggressiveMergingPlugin  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									constructor ( options )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if ( options  !==  undefined  &&  typeof  options  !==  "object"  ||  Array . isArray ( options ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 04:57:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											throw  new  Error ( "Argument should be an options object. To use defaults, pass in nothing.\nFor more info on options, see https://webpack.js.org/plugins/" ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										this . options  =  options  ||  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									apply ( compiler )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 07:33:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  options  =  this . options ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  minSizeReduce  =  options . minSizeReduce  ||  1.5 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-06 22:01:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										compiler . hooks . thisCompilation . tap ( "AggressiveMergingPlugin" ,  ( compilation )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											compilation . hooks . optimizeChunksAdvanced . tap ( "AggressiveMergingPlugin" ,  ( chunks )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												let  combinations  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												chunks . forEach ( ( a ,  idx )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-22 19:15:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if ( a . canBeInitial ( ) )  return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													for ( let  i  =  0 ;  i  <  idx ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														const  b  =  chunks [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-22 19:15:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if ( b . canBeInitial ( ) )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														combinations . push ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															a , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															b , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															improvement :  undefined 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-13 06:20:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												combinations . forEach ( ( pair )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  a  =  pair . b . size ( { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														chunkOverhead :  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  b  =  pair . a . size ( { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														chunkOverhead :  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  ab  =  pair . b . integratedSize ( pair . a ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														chunkOverhead :  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													let  newSize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if ( ab  ===  false )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														pair . improvement  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														newSize  =  ab ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													pair . improvement  =  ( a  +  b )  /  newSize ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												combinations  =  combinations . filter ( ( pair )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  pair . improvement  !==  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												combinations . sort ( ( a ,  b )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  b . improvement  -  a . improvement ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  pair  =  combinations [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if ( ! pair )  return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if ( pair . improvement  <  minSizeReduce )  return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 02:18:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if ( pair . b . integrate ( pair . a ,  "aggressive-merge" ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													chunks . splice ( chunks . indexOf ( pair . a ) ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 19:05:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 05:18:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module . exports  =  AggressiveMergingPlugin ;