Skip to content

Commit a84a043

Browse files
committed
better optimizing
1 parent dabbab4 commit a84a043

File tree

5 files changed

+72
-56
lines changed

5 files changed

+72
-56
lines changed

lib/Chunk.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,36 @@ Chunk.prototype.updateHash = function(hash) {
137137
});
138138
};
139139

140+
Chunk.prototype.size = function(options) {
141+
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
142+
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
143+
144+
var modulesSize = this.modules.map(function(m) {
145+
return m.size();
146+
}).reduce(function(a, b) {
147+
return a + b;
148+
}, 0);
149+
return modulesSize * (this.entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
150+
};
151+
152+
Chunk.prototype.integratedSize = function(other, options) {
153+
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
154+
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
155+
156+
var mergedModules = this.modules.slice();
157+
other.modules.forEach(function(m) {
158+
if(this.modules.indexOf(m) < 0)
159+
mergedModules.push(m);
160+
}, this);
161+
162+
var modulesSize = mergedModules.map(function(m) {
163+
return m.size();
164+
}).reduce(function(a, b) {
165+
return a + b;
166+
}, 0);
167+
return modulesSize * (this.entry || other.entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
168+
};
169+
140170
Chunk.prototype.toString = function() {
141171
return "Chunk[" + this.modules.join() + "]";
142172
};

lib/WebpackOptionsApply.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
147147
compiler.apply(new OccurenceOrderPlugin(options.optimize.occurenceOrderPreferEntry));
148148

149149
if(options.optimize && options.optimize.minChunkSize)
150-
compiler.apply(new MinChunkSizePlugin(options.optimize.minChunkSize));
150+
compiler.apply(new MinChunkSizePlugin(options.optimize));
151151

152152
if(options.optimize && options.optimize.maxChunks)
153153
compiler.apply(new LimitChunkCountPlugin(options.optimize));

lib/optimize/LimitChunkCountPlugin.js

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
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-
135
function LimitChunkCountPlugin(options) {
146
this.options = options || {};
157
}
@@ -24,9 +16,6 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
2416
if(maxChunks < 1) return;
2517
if(chunks.length <= maxChunks) return;
2618

27-
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
28-
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
29-
3019
if(chunks.length > maxChunks) {
3120
var combinations = [];
3221
chunks.forEach(function(a, idx) {
@@ -37,16 +26,9 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
3726
});
3827

3928
combinations.forEach(function(pair) {
40-
var modulesA = pair[0].modules;
41-
var modulesB = pair[1].modules;
42-
var mergedModules = modulesA.slice();
43-
modulesB.forEach(function(m) {
44-
if(modulesA.indexOf(m) < 0)
45-
mergedModules.push(m);
46-
});
47-
var a = chunkSizeWithModules(modulesA) * (pair[0].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
48-
var b = chunkSizeWithModules(modulesB) * (pair[1].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
49-
var ab = chunkSizeWithModules(mergedModules) * (pair[0].entry || pair[1].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
29+
var a = pair[0].size(options);
30+
var b = pair[1].size(options);
31+
var ab = pair[0].integratedSize(pair[1], options);
5032
pair.unshift(a + b - ab, ab);
5133
});
5234
combinations.sort(function(a,b) {

lib/optimize/MinChunkSizePlugin.js

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,53 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
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;
157
}
168
module.exports = MinChunkSizePlugin;
179

1810
MinChunkSizePlugin.prototype.apply = function(compiler) {
19-
var minChunkSize = this.minChunkSize;
11+
var options = this.options;
12+
var minChunkSize = options.minChunkSize;
2013
compiler.plugin("compilation", function(compilation) {
2114
compilation.plugin("optimize-chunks", function(chunks) {
2215

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]);
3221
}
33-
return a.size - b.size;
3422
});
3523

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();
4852
});
4953
});
5054
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webpack",
3-
"version": "0.10.0-beta23",
3+
"version": "0.10.0-beta24",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs/AMD/Labeled Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.",
66
"dependencies": {

0 commit comments

Comments
 (0)