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() {
return "Chunk[" + this.modules.join() + "]";
};

View File

@ -147,7 +147,7 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
compiler.apply(new OccurenceOrderPlugin(options.optimize.occurenceOrderPreferEntry));
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)
compiler.apply(new LimitChunkCountPlugin(options.optimize));

View File

@ -2,14 +2,6 @@
MIT License http://www.opensource.org/licenses/mit-license.php
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) {
this.options = options || {};
}
@ -24,9 +16,6 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
if(maxChunks < 1) return;
if(chunks.length <= maxChunks) return;
var CHUNK_OVERHEAD = options.chunkOverhead || 10000;
var ENTRY_CHUNK_MULTIPLICATOR = options.entryChunkMultiplicator || 10;
if(chunks.length > maxChunks) {
var combinations = [];
chunks.forEach(function(a, idx) {
@ -37,16 +26,9 @@ LimitChunkCountPlugin.prototype.apply = function(compiler) {
});
combinations.forEach(function(pair) {
var modulesA = pair[0].modules;
var modulesB = pair[1].modules;
var mergedModules = modulesA.slice();
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;
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) {

View File

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

View File

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