From e3fdcce5097fac74bb33932624239a402423628a Mon Sep 17 00:00:00 2001 From: "Michael \"Z\" Goddard" Date: Mon, 2 Jul 2018 07:49:20 -0400 Subject: [PATCH 1/2] fix: store hashes in module cache --- lib/TransformNormalModulePlugin.js | 78 ++++++++++++++++++++++-------- lib/util/serial.js | 22 +++++++++ 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/lib/TransformNormalModulePlugin.js b/lib/TransformNormalModulePlugin.js index cababd7d..69d2d3a9 100644 --- a/lib/TransformNormalModulePlugin.js +++ b/lib/TransformNormalModulePlugin.js @@ -28,29 +28,28 @@ const serialResolved = serial.created({ // loaders: serial.loaders, }); -const serialResolvedMap = { - freeze(arg, module, extra) { - const resolved = []; - for (const key in arg) { - const thawedKey = JSON.parse(key); - resolved.push([ - serialResolveRequest.freeze(thawedKey, thawedKey, extra), - serialResolved.freeze(arg[key], arg[key], extra), - ]); - } - return resolved; +const serialJson = { + freeze(arg, value, extra) { + return JSON.parse(arg); }, thaw(arg, frozen, extra) { - const resolved = {}; - for (const item of arg) { - const key = serialResolveRequest.thaw(item[0], item[0], extra); - const value = serialResolved.thaw(item[1], item[1], extra); - resolved[JSON.stringify(key)] = value; - } - return resolved; + return JSON.stringify(arg); }, }; +const serialMap = serial.map; + +const serialResolvedMap = serial.map( + serial.pipe( + { freeze: serialJson.freeze, thaw: serial.identity.thaw }, + serialResolveRequest, + { freeze: serial.identity.freeze, thaw: serialJson.thaw }, + ), + serialResolved, +); + +const serialResourceHashMap = serial.map(serial.request, serial.identity); + const serialNormalModule4 = serial.serial('NormalModule', { constructor: serial.constructed(NormalModule, { data: serial.pipe( @@ -166,6 +165,25 @@ const serialNormalModule4 = serial.serial('NormalModule', { _lastSuccessfulBuildMeta: serial.identity, __hardSource_resolved: serialResolvedMap, + __hardSource_oldHashes: serial.pipe( + { + freeze(arg, module, extra) { + const obj = {}; + const cachedMd5s = compilation.__hardSourceCachedMd5s; + + for (const file of module.buildInfo.fileDependencies) { + obj[file] = cachedHashes[file]; + } + for (const dir of module.buildInfo.contextDependencies) { + obj[dir] = cachedHashes[dir]; + } + + return obj; + }, + thaw: serial.identity.thaw, + }, + serialResourceHashMap, + ), }), dependencyBlock: serial.dependencyBlock, @@ -200,7 +218,7 @@ const needRebuild4 = function() { return true; } const fileHashes = this.__hardSourceFileMd5s; - const cachedHashes = this.__hardSourceCachedMd5s; + const cachedHashes = this.__hardSource_oldHashes; const resolvedLast = this.__hardSource_resolved; const missingCache = this.__hardSource_missingCache; @@ -348,6 +366,25 @@ const serialNormalModule3 = serial.serial('NormalModule', { _source: serial.source, __hardSource_resolved: serialResolvedMap, + __hardSource_oldHashes: serial.pipe( + { + freeze(arg, module, extra) { + const obj = {}; + const cachedMd5s = extra.compilation.__hardSourceCachedMd5s; + + for (const file of module.fileDependencies) { + obj[file] = cachedMd5s[file]; + } + for (const dir of module.contextDependencies) { + obj[dir] = cachedMd5s[dir]; + } + + return obj; + }, + thaw: serial.identity.thaw, + }, + serialResourceHashMap, + ), }), hash: { @@ -392,7 +429,7 @@ const needRebuild3 = function() { return true; } const fileHashes = this.__hardSourceFileMd5s; - const cachedHashes = this.__hardSourceCachedMd5s; + const cachedHashes = this.__hardSource_oldHashes; const resolvedLast = this.__hardSource_resolved; const missingCache = this.__hardSource_missingCache; @@ -557,6 +594,7 @@ class TransformNormalModulePlugin { module.cacheItem.invalid = false; module.cacheItem.invalidReason = null; } + const f = serialNormalModule.freeze( null, module, diff --git a/lib/util/serial.js b/lib/util/serial.js index fe238bd5..9dd30122 100644 --- a/lib/util/serial.js +++ b/lib/util/serial.js @@ -15,6 +15,28 @@ const pipe = (exports.pipe = (...fns) => ({ }, })); +const serialMap = (exports.map = (keyOp, valueOp) => ({ + freeze(arg, module, extra) { + const resolved = []; + for (const key in arg) { + resolved.push([ + keyOp.freeze(key, key, extra), + valueOp.freeze(arg[key], arg[key], extra), + ]); + } + return resolved; + }, + thaw(arg, frozen, extra) { + const resolved = {}; + for (const item of arg) { + const key = keyOp.thaw(item[0], item[0], extra); + const value = valueOp.thaw(item[1], item[1], extra); + resolved[key] = value; + } + return resolved; + }, +})); + const contextual = (exports.contextual = fnname => { const relate = relateContext[`relateNormal${fnname}`]; const context = relateContext[`contextNormal${fnname}`]; From c2c7453124c3e6052b2a001ea69a9c3c88f0d162 Mon Sep 17 00:00:00 2001 From: "Michael \"Z\" Goddard" Date: Mon, 2 Jul 2018 08:20:04 -0400 Subject: [PATCH 2/2] fixup! fix: store hashes in module cache --- lib/TransformNormalModulePlugin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/TransformNormalModulePlugin.js b/lib/TransformNormalModulePlugin.js index 69d2d3a9..4559af13 100644 --- a/lib/TransformNormalModulePlugin.js +++ b/lib/TransformNormalModulePlugin.js @@ -169,13 +169,13 @@ const serialNormalModule4 = serial.serial('NormalModule', { { freeze(arg, module, extra) { const obj = {}; - const cachedMd5s = compilation.__hardSourceCachedMd5s; + const cachedMd5s = extra.compilation.__hardSourceCachedMd5s; for (const file of module.buildInfo.fileDependencies) { - obj[file] = cachedHashes[file]; + obj[file] = cachedMd5s[file]; } for (const dir of module.buildInfo.contextDependencies) { - obj[dir] = cachedHashes[dir]; + obj[dir] = cachedMd5s[dir]; } return obj;