|
2 | 2 | MIT License http://www.opensource.org/licenses/mit-license.php |
3 | 3 | Author Tobias Koppers @sokra |
4 | 4 | */ |
5 | | -function chunkSizeWithModules(modules) { |
6 | | - return modules.map(function(m) { |
7 | | - return m.size(); |
8 | | - }).reduce(function(a, b) { |
9 | | - return a + b; |
10 | | - }); |
11 | | -} |
12 | | - |
13 | | -function MinChunkSizePlugin(minChunkSize) { |
14 | | - this.minChunkSize = minChunkSize; |
| 5 | +function MinChunkSizePlugin(options) { |
| 6 | + this.options = options; |
15 | 7 | } |
16 | 8 | module.exports = MinChunkSizePlugin; |
17 | 9 |
|
18 | 10 | MinChunkSizePlugin.prototype.apply = function(compiler) { |
19 | | - var minChunkSize = this.minChunkSize; |
| 11 | + var options = this.options; |
| 12 | + var minChunkSize = options.minChunkSize; |
20 | 13 | compiler.plugin("compilation", function(compilation) { |
21 | 14 | compilation.plugin("optimize-chunks", function(chunks) { |
22 | 15 |
|
23 | | - var argumentedChunks = chunks.map(function(chunk) { |
24 | | - return { |
25 | | - size: chunkSizeWithModules(chunk.modules), |
26 | | - entry: !!chunk.entry, |
27 | | - chunk: chunk |
28 | | - } |
29 | | - }).sort(function(a, b) { |
30 | | - if(a.entry != b.entry) { |
31 | | - return a.entry ? 1 : -1; |
| 16 | + var combinations = []; |
| 17 | + chunks.forEach(function(a, idx) { |
| 18 | + for(var i = 0; i < idx; i++) { |
| 19 | + var b = chunks[i]; |
| 20 | + combinations.push([b, a]); |
32 | 21 | } |
33 | | - return a.size - b.size; |
34 | 22 | }); |
35 | 23 |
|
36 | | - if(argumentedChunks.length > 0 && argumentedChunks[0].size < minChunkSize && !argumentedChunks[0].entry) { |
37 | | - for(var i = 1; i < argumentedChunks.length; i++) { |
38 | | - if(argumentedChunks[i].size + argumentedChunks[0].size >= minChunkSize) |
39 | | - break; |
40 | | - } |
41 | | - if(i == argumentedChunks.length) i = 1; |
42 | | - if(argumentedChunks[i]) { |
43 | | - argumentedChunks[i].chunk.integrate(argumentedChunks[0].chunk, "min-size"); |
44 | | - chunks.splice(chunks.indexOf(argumentedChunks[0].chunk), 1); |
45 | | - this.restartApplyPlugins(); |
46 | | - } |
47 | | - } |
| 24 | + var equalOptions = { |
| 25 | + chunkOverhead: 1, |
| 26 | + entryChunkMultiplicator: 1 |
| 27 | + }; |
| 28 | + combinations = combinations.filter(function(pair) { |
| 29 | + return pair[0].size(equalOptions) < minChunkSize || pair[1].size(equalOptions) < minChunkSize; |
| 30 | + }); |
| 31 | + |
| 32 | + if(combinations.length == 0) return; |
| 33 | + |
| 34 | + combinations.forEach(function(pair) { |
| 35 | + var a = pair[0].size(options); |
| 36 | + var b = pair[1].size(options); |
| 37 | + var ab = pair[0].integratedSize(pair[1], options); |
| 38 | + pair.unshift(a + b - ab, ab); |
| 39 | + }); |
| 40 | + |
| 41 | + combinations.sort(function(a,b) { |
| 42 | + var diff = b[0] - a[0]; |
| 43 | + if(diff != 0) return diff; |
| 44 | + return a[1] - b[1]; |
| 45 | + }); |
| 46 | + |
| 47 | + var pair = combinations[0]; |
| 48 | + |
| 49 | + pair[2].integrate(pair[3], "min-size"); |
| 50 | + chunks.splice(chunks.indexOf(pair[3]), 1); |
| 51 | + this.restartApplyPlugins(); |
48 | 52 | }); |
49 | 53 | }); |
50 | 54 | }; |
|
0 commit comments