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
2018-01-22 20:52:43 +08:00
for ( const pair of combinations ) {
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 ;
2018-01-22 20:52:43 +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 ;