diff --git a/lib/Compilation.js b/lib/Compilation.js index 39fa69831..ec1755538 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -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)) }; diff --git a/lib/optimize/RemoveParentModulesPlugin.js b/lib/optimize/RemoveParentModulesPlugin.js index 6612848c0..880ebc35d 100644 --- a/lib/optimize/RemoveParentModulesPlugin.js +++ b/lib/optimize/RemoveParentModulesPlugin.js @@ -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);