aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-08-14 05:01:11 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-08-14 05:02:09 +0200
commit363723fc84f7b8477592e0105aeb331ec9a017af (patch)
tree29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js
parent5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff)
node_modules
Diffstat (limited to 'node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js')
-rw-r--r--node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js101
1 files changed, 52 insertions, 49 deletions
diff --git a/node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js b/node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js
index e05b3eb4c..b6f566a1c 100644
--- a/node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js
+++ b/node_modules/webpack/lib/optimize/AggressiveSplittingPlugin.js
@@ -6,18 +6,6 @@
const identifierUtils = require("../util/identifier");
-function toIndexOf(list) {
- return function(item) {
- return list.indexOf(item);
- };
-}
-
-function toChunkModuleIndices(modules) {
- return function(idx) {
- return modules[idx];
- };
-}
-
function moveModuleBetween(oldChunk, newChunk) {
return function(module) {
oldChunk.moveModule(module, newChunk);
@@ -49,8 +37,15 @@ class AggressiveSplittingPlugin {
if(typeof this.options.entryChunkMultiplicator !== "number") this.options.entryChunkMultiplicator = 1;
}
apply(compiler) {
- compiler.plugin("compilation", (compilation) => {
+ compiler.plugin("this-compilation", (compilation) => {
compilation.plugin("optimize-chunks-advanced", (chunks) => {
+ // Precompute stuff
+ const nameToModuleMap = new Map();
+ compilation.modules.forEach(m => {
+ const name = identifierUtils.makePathsRelative(compiler.context, m.identifier(), compilation.cache);
+ nameToModuleMap.set(name, m);
+ });
+
const savedSplits = compilation.records && compilation.records.aggressiveSplits || [];
const usedSplits = compilation._aggressiveSplittingSplits ?
savedSplits.concat(compilation._aggressiveSplittingSplits) : savedSplits;
@@ -60,50 +55,58 @@ class AggressiveSplittingPlugin {
// 1. try to restore to recorded splitting
for(let j = 0; j < usedSplits.length; j++) {
const splitData = usedSplits[j];
- for(let i = 0; i < chunks.length; i++) {
- const chunk = chunks[i];
- const chunkModuleNames = chunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()));
+ const selectedModules = splitData.modules.map(name => nameToModuleMap.get(name));
- if(chunkModuleNames.length < splitData.modules.length)
- continue;
- const moduleIndicies = splitData.modules.map(toIndexOf(chunkModuleNames));
- const hasAllModules = moduleIndicies.every((idx) => {
- return idx >= 0;
- });
- if(hasAllModules) {
- if(chunkModuleNames.length > splitData.modules.length) {
- const selectedModules = moduleIndicies.map(toChunkModuleIndices(chunk.modules));
- const newChunk = compilation.addChunk();
- selectedModules.forEach(moveModuleBetween(chunk, newChunk));
- chunk.split(newChunk);
- chunk.name = null;
- newChunk._fromAggressiveSplitting = true;
- if(j < savedSplits.length)
- newChunk._fromAggressiveSplittingIndex = j;
- if(splitData.id !== null && splitData.id !== undefined) {
- newChunk.id = splitData.id;
- }
- newChunk.origins = chunk.origins.map(copyWithReason);
- chunk.origins = chunk.origins.map(copyWithReason);
- return true;
- } else {
- if(j < savedSplits.length)
- chunk._fromAggressiveSplittingIndex = j;
- chunk.name = null;
- if(splitData.id !== null && splitData.id !== undefined) {
- chunk.id = splitData.id;
+ // Does the modules exist at all?
+ if(selectedModules.every(Boolean)) {
+
+ // Find all chunks containing all modules in the split
+ for(let i = 0; i < chunks.length; i++) {
+ const chunk = chunks[i];
+
+ // Cheap check if chunk is suitable at all
+ if(chunk.getNumberOfModules() < splitData.modules.length)
+ continue;
+
+ // Check if all modules are in the chunk
+ if(selectedModules.every(m => chunk.containsModule(m))) {
+
+ // Is chunk identical to the split or do we need to split it?
+ if(chunk.getNumberOfModules() > splitData.modules.length) {
+ // split the chunk into two parts
+ const newChunk = compilation.addChunk();
+ selectedModules.forEach(moveModuleBetween(chunk, newChunk));
+ chunk.split(newChunk);
+ chunk.name = null;
+ newChunk._fromAggressiveSplitting = true;
+ if(j < savedSplits.length)
+ newChunk._fromAggressiveSplittingIndex = j;
+ if(splitData.id !== null && splitData.id !== undefined) {
+ newChunk.id = splitData.id;
+ }
+ newChunk.origins = chunk.origins.map(copyWithReason);
+ chunk.origins = chunk.origins.map(copyWithReason);
+ return true;
+ } else { // chunk is identical to the split
+ if(j < savedSplits.length)
+ chunk._fromAggressiveSplittingIndex = j;
+ chunk.name = null;
+ if(splitData.id !== null && splitData.id !== undefined) {
+ chunk.id = splitData.id;
+ }
}
}
}
}
}
+
// 2. for any other chunk which isn't splitted yet, split it
for(let i = 0; i < chunks.length; i++) {
const chunk = chunks[i];
const size = chunk.size(this.options);
- if(size > maxSize && chunk.modules.length > 1) {
+ if(size > maxSize && chunk.getNumberOfModules() > 1) {
const newChunk = compilation.addChunk();
- const modules = chunk.modules
+ const modules = chunk.getModules()
.filter(isNotAEntryModule(chunk.entryModule))
.sort((a, b) => {
a = a.identifier();
@@ -131,13 +134,13 @@ class AggressiveSplittingPlugin {
break;
}
}
- if(newChunk.modules.length > 0) {
+ if(newChunk.getNumberOfModules() > 0) {
chunk.split(newChunk);
chunk.name = null;
newChunk.origins = chunk.origins.map(copyWithReason);
chunk.origins = chunk.origins.map(copyWithReason);
compilation._aggressiveSplittingSplits = (compilation._aggressiveSplittingSplits || []).concat({
- modules: newChunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()))
+ modules: newChunk.mapModules(m => identifierUtils.makePathsRelative(compiler.context, m.identifier(), compilation.cache))
});
return true;
} else {
@@ -154,7 +157,7 @@ class AggressiveSplittingPlugin {
if(chunk.hasEntryModule()) return;
const size = chunk.size(this.options);
const incorrectSize = size < minSize;
- const modules = chunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()));
+ const modules = chunk.mapModules(m => identifierUtils.makePathsRelative(compiler.context, m.identifier(), compilation.cache));
if(typeof chunk._fromAggressiveSplittingIndex === "undefined") {
if(incorrectSize) return;
chunk.recorded = true;