mirror of https://github.com/webpack/webpack.git
better optimizing
This commit is contained in:
parent
dabbab4627
commit
a84a0433c9
30
lib/Chunk.js
30
lib/Chunk.js
|
@ -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() + "]";
|
||||||
};
|
};
|
|
@ -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));
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
this.restartApplyPlugins();
|
|
||||||
}
|
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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
Loading…
Reference in New Issue