better optimizing

This commit is contained in:
Tobias Koppers 2013-06-17 18:55:11 +02:00
parent dabbab4627
commit a84a0433c9
5 changed files with 72 additions and 56 deletions

View File

@ -137,6 +137,36 @@ Chunk.prototype.updateHash = function(hash) {
}); });
}; };
Chunk.prototype.size = function(options) {
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
var modulesSize = this.modules.map(function(m) {
return m.size();
}).reduce(function(a, b) {
return a + b;
}, 0);
return modulesSize * (this.entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
};
Chunk.prototype.integratedSize = function(other, options) {
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
var mergedModules = this.modules.slice();
other.modules.forEach(function(m) {
if(this.modules.indexOf(m) < 0)
mergedModules.push(m);
}, this);
var modulesSize = mergedModules.map(function(m) {
return m.size();
}).reduce(function(a, b) {
return a + b;
}, 0);
return modulesSize * (this.entry || other.entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
};
Chunk.prototype.toString = function() { Chunk.prototype.toString = function() {
return "Chunk[" + this.modules.join() + "]"; return "Chunk[" + this.modules.join() + "]";
}; };

View File

@ -147,7 +147,7 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
compiler.apply(new OccurenceOrderPlugin(options.optimize.occurenceOrderPreferEntry)); compiler.apply(new OccurenceOrderPlugin(options.optimize.occurenceOrderPreferEntry));
if(options.optimize && options.optimize.minChunkSize) if(options.optimize && options.optimize.minChunkSize)
compiler.apply(new MinChunkSizePlugin(options.optimize.minChunkSize)); compiler.apply(new MinChunkSizePlugin(options.optimize));
if(options.optimize && options.optimize.maxChunks) if(options.optimize && options.optimize.maxChunks)
compiler.apply(new LimitChunkCountPlugin(options.optimize)); compiler.apply(new LimitChunkCountPlugin(options.optimize));

View File

@ -2,14 +2,6 @@
MIT License http://www.opensource.org/licenses/mit-license.php MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra Author Tobias Koppers @sokra
*/ */
function chunkSizeWithModules(modules) {
return modules.map(function(m) {
return m.size();
}).reduce(function(a, b) {
return a + b;
});
}
function LimitChunkCountPlugin(options) { function LimitChunkCountPlugin(options) {
this.options = options || {}; this.options = options || {};
} }
@ -24,9 +16,6 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
if(maxChunks < 1) return; if(maxChunks < 1) return;
if(chunks.length <= maxChunks) return; if(chunks.length <= maxChunks) return;
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
if(chunks.length > maxChunks) { if(chunks.length > maxChunks) {
var combinations = []; var combinations = [];
chunks.forEach(function(a, idx) { chunks.forEach(function(a, idx) {
@ -37,16 +26,9 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
}); });
combinations.forEach(function(pair) { combinations.forEach(function(pair) {
var modulesA = pair[0].modules; var a = pair[0].size(options);
var modulesB = pair[1].modules; var b = pair[1].size(options);
var mergedModules = modulesA.slice(); var ab = pair[0].integratedSize(pair[1], options);
modulesB.forEach(function(m) {
if(modulesA.indexOf(m) < 0)
mergedModules.push(m);
});
var a = chunkSizeWithModules(modulesA) * (pair[0].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
var b = chunkSizeWithModules(modulesB) * (pair[1].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
var ab = chunkSizeWithModules(mergedModules) * (pair[0].entry || pair[1].entry ? ENTRY_CHUNK_MULTIPLICATOR : 1) + CHUNK_OVERHEAD;
pair.unshift(a + b - ab, ab); pair.unshift(a + b - ab, ab);
}); });
combinations.sort(function(a,b) { combinations.sort(function(a,b) {

View File

@ -2,49 +2,53 @@
MIT License http://www.opensource.org/licenses/mit-license.php MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra Author Tobias Koppers @sokra
*/ */
function chunkSizeWithModules(modules) { function MinChunkSizePlugin(options) {
return modules.map(function(m) { this.options = options;
return m.size();
}).reduce(function(a, b) {
return a + b;
});
}
function MinChunkSizePlugin(minChunkSize) {
this.minChunkSize = minChunkSize;
} }
module.exports = MinChunkSizePlugin; module.exports = MinChunkSizePlugin;
MinChunkSizePlugin.prototype.apply = function(compiler) { MinChunkSizePlugin.prototype.apply = function(compiler) {
var minChunkSize = this.minChunkSize; var options = this.options;
var minChunkSize = options.minChunkSize;
compiler.plugin("compilation", function(compilation) { compiler.plugin("compilation", function(compilation) {
compilation.plugin("optimize-chunks", function(chunks) { compilation.plugin("optimize-chunks", function(chunks) {
var argumentedChunks = chunks.map(function(chunk) { var combinations = [];
return { chunks.forEach(function(a, idx) {
size: chunkSizeWithModules(chunk.modules), for(var i = 0; i < idx; i++) {
entry: !!chunk.entry, var b = chunks[i];
chunk: chunk combinations.push([b, a]);
} }
}).sort(function(a, b) {
if(a.entry != b.entry) {
return a.entry ? 1 : -1;
}
return a.size - b.size;
}); });
if(argumentedChunks.length > 0 && argumentedChunks[0].size < minChunkSize && !argumentedChunks[0].entry) { var equalOptions = {
for(var i = 1; i < argumentedChunks.length; i++) { chunkOverhead: 1,
if(argumentedChunks[i].size + argumentedChunks[0].size >= minChunkSize) entryChunkMultiplicator: 1
break; };
} combinations = combinations.filter(function(pair) {
if(i == argumentedChunks.length) i = 1; return pair[0].size(equalOptions) < minChunkSize || pair[1].size(equalOptions) < minChunkSize;
if(argumentedChunks[i]) { });
argumentedChunks[i].chunk.integrate(argumentedChunks[0].chunk, "min-size");
chunks.splice(chunks.indexOf(argumentedChunks[0].chunk), 1); if(combinations.length == 0) return;
combinations.forEach(function(pair) {
var a = pair[0].size(options);
var b = pair[1].size(options);
var ab = pair[0].integratedSize(pair[1], options);
pair.unshift(a + b - ab, ab);
});
combinations.sort(function(a,b) {
var diff = b[0] - a[0];
if(diff != 0) return diff;
return a[1] - b[1];
});
var pair = combinations[0];
pair[2].integrate(pair[3], "min-size");
chunks.splice(chunks.indexOf(pair[3]), 1);
this.restartApplyPlugins(); this.restartApplyPlugins();
}
}
}); });
}); });
}; };

View File

@ -1,6 +1,6 @@
{ {
"name": "webpack", "name": "webpack",
"version": "0.10.0-beta23", "version": "0.10.0-beta24",
"author": "Tobias Koppers @sokra", "author": "Tobias Koppers @sokra",
"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.", "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.",
"dependencies": { "dependencies": {