More refactoring Compilation.js and RemoveParentModulesPlugin.js

This commit is contained in:
Tom910 2017-01-25 22:39:24 +03:00
parent 588976d5e9
commit 74efa93d5f
2 changed files with 64 additions and 49 deletions

View File

@ -88,13 +88,13 @@ class Compilation extends Tapable {
}
addModule(module, cacheGroup) {
cacheGroup = cacheGroup || "m";
const identifier = module.identifier();
if(this._modules[identifier]) {
return false;
}
if(this.cache && this.cache[cacheGroup + identifier]) {
const cacheModule = this.cache[cacheGroup + identifier];
const cacheName = (cacheGroup || "m") + identifier;
if(this.cache && this.cache[cacheName]) {
const cacheModule = this.cache[cacheName];
let rebuild = true;
if(!cacheModule.error && cacheModule.cacheable && this.fileTimestamps && this.contextTimestamps) {
@ -115,7 +115,7 @@ class Compilation extends Tapable {
module.unbuild();
this._modules[identifier] = module;
if(this.cache) {
this.cache[cacheGroup + identifier] = module;
this.cache[cacheName] = module;
}
this.modules.push(module);
return true;
@ -752,7 +752,7 @@ class Compilation extends Tapable {
iterationOfArrayCallback(block.dependencies, iteratorDependency);
}
if(block.blocks) {
var blocks = block.blocks.slice();
var blocks = block.blocks;
var indexBlock = blocks.length;
while(indexBlock--) {
iteratorBlock(blocks[indexBlock]);
@ -900,37 +900,50 @@ class Compilation extends Tapable {
}
applyModuleIds() {
const unusedIds = [];
let nextFreeModuleId = 0;
const usedIds = [];
const usedIdMap = {};
var unusedIds = [];
var nextFreeModuleId = 0;
var usedIds = [];
// TODO
var usedIdMap = Object.create(null);
if(this.usedModuleIds) {
Object.keys(this.usedModuleIds).forEach(key => {
const id = this.usedModuleIds[key];
if(typeof usedIdMap[id] === "undefined") {
if(!usedIdMap[id]) {
usedIds.push(id);
usedIdMap[id] = id;
usedIdMap[id] = true;
}
});
}
// TODO
var modules1 = this.modules;
for(var indexModule1 = 0; indexModule1 < modules1.length; indexModule1++) {
var module1 = modules1[indexModule1];
if(module1.id !== null && typeof usedIdMap[module1.id] === "undefined") {
if(module1.id && !usedIdMap[module1.id]) {
usedIds.push(module1.id);
usedIdMap[module1.id] = module1.id;
usedIdMap[module1.id] = true;
}
}
if(usedIds.length > 0) {
const usedNumberIds = usedIds.filter(id => typeof id === "number");
nextFreeModuleId = usedNumberIds.reduce((a, b) => Math.max(a, b), -1) + 1;
for(let i = 0; i < nextFreeModuleId; i++) {
if(usedIdMap[i] !== i)
unusedIds.push(i);
var usedIdMax = -1;
for(var index = 0; index < usedIds.length; index++) {
var usedIdKey = usedIds[index];
if(typeof usedIdKey !== "number") {
continue;
}
usedIdMax = Math.max(usedIdMax, usedIdKey);
}
var lengthFreeModules = nextFreeModuleId = usedIdMax + 1;
while(lengthFreeModules--) {
if(!usedIdMap[lengthFreeModules]) {
unusedIds.push(lengthFreeModules);
}
}
unusedIds.reverse();
}
var modules2 = this.modules;
@ -969,11 +982,12 @@ class Compilation extends Tapable {
if(this.usedChunkIds) {
nextFreeChunkId = getNextFreeChunkId(this.usedChunkIds) + 1;
for(let i = 0; i < nextFreeChunkId; i++) {
if(this.usedChunkIds[i] !== i)
unusedIds.push(i);
var index = nextFreeChunkId;
while(index--) {
if(this.usedChunkIds[index] !== index) {
unusedIds.push(index);
}
}
unusedIds.reverse();
}
var chunks = this.chunks;
@ -1165,8 +1179,9 @@ class Compilation extends Tapable {
try {
const useChunkHash = !chunk.hasRuntime() || (this.mainTemplate.useChunkHash && this.mainTemplate.useChunkHash(chunk));
const usedHash = useChunkHash ? chunkHash : this.fullHash;
if(this.cache && this.cache[`c${chunk.id}`] && this.cache[`c${chunk.id}`].hash === usedHash) {
source = this.cache[`c${chunk.id}`].source;
const cacheName = "c" + chunk.id;
if(this.cache && this.cache[cacheName] && this.cache[cacheName].hash === usedHash) {
source = this.cache[cacheName].source;
} else {
if(chunk.hasRuntime()) {
source = this.mainTemplate.render(this.hash, chunk, this.moduleTemplate, this.dependencyTemplates);
@ -1174,7 +1189,7 @@ class Compilation extends Tapable {
source = this.chunkTemplate.render(chunk, this.moduleTemplate, this.dependencyTemplates);
}
if(this.cache) {
this.cache[`c${chunk.id}`] = {
this.cache[cacheName] = {
hash: usedHash,
source: source = (source instanceof CachedSource ? source : new CachedSource(source))
};

View File

@ -24,35 +24,35 @@ function hasModule(chunk, module, checkedChunks) {
function allHaveModule(someChunks, module, checkedChunks) {
if(!checkedChunks) checkedChunks = [];
let chunks = [];
var chunks = [];
for(var i = 0; i < someChunks.length; i++) {
checkedChunks.push(someChunks[i]);
const subChunks = hasModule(someChunks[i], module, checkedChunks);
var subChunks = hasModule(someChunks[i], module, checkedChunks);
if(!subChunks) return false;
addToSet(chunks, subChunks);
for(var index = 0; index < subChunks.length; index++) {
var item = subChunks[index];
if(!chunks.length || chunks.indexOf(item) < 0) {
chunks.push(item);
}
}
}
return chunks;
}
function addToSet(set, items) {
for(var index = 0; index < items.length; index++) {
var item = items[index];
if(set.indexOf(item) < 0) {
set.push(item);
}
}
}
function debugIds(chunks) {
const list = chunks.map((chunk) => {
return chunk.debugId;
});
const debugIdMissing = list.some((dId) => {
return typeof dId !== "number";
});
if(debugIdMissing)
return "no";
var list = [];
for(var i = 0; i < chunks.length; i++) {
var debugId = chunks[i].debugId;
if(typeof debugId !== "number") {
return "no";
}
list.push(debugId);
}
list.sort();
return list.join(",");
}
@ -70,9 +70,9 @@ class RemoveParentModulesPlugin {
var module = modules[i];
if(chunk.parents.length === 0) continue;
var dId = "$" + debugIds(module.chunks);
var dId = debugIds(module.chunks);
var parentChunksWithModule;
if((dId in cache) && dId !== "$no") {
if((dId in cache) && dId !== "no") {
parentChunksWithModule = cache[dId];
} else {
parentChunksWithModule = cache[dId] = allHaveModule(chunk.parents, module);