Skip to content

Commit

Permalink
fix restoring from cache
Browse files Browse the repository at this point in the history
  • Loading branch information
vankop committed Feb 8, 2022
1 parent 02a7a9e commit cdfb610
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 101 deletions.
24 changes: 13 additions & 11 deletions lib/ContextModule.js
Expand Up @@ -92,17 +92,10 @@ class ContextModule extends Module {
* @param {ContextModuleOptions} options options object
*/
constructor(resolveDependencies, options) {
if (typeof options.resource !== "string") {
super("javascript/dynamic");
/** @type {ContextModuleOptions} */
this.options = {
...options,
resource: options.resource,
resourceQuery: options.resourceQuery || "",
resourceFragment: options.resourceFragment || ""
};
} else {
const parsed = parseResource(options.resource);
if (!options || typeof options.resource === "string") {
const parsed = parseResource(
options ? /** @type {string} */ (options.resource) : ""
);
const resource = parsed.path;
const resourceQuery = (options && options.resourceQuery) || parsed.query;
const resourceFragment =
Expand All @@ -116,6 +109,15 @@ class ContextModule extends Module {
resourceQuery,
resourceFragment
};
} else {
super("javascript/dynamic");
/** @type {ContextModuleOptions} */
this.options = {
...options,
resource: options.resource,
resourceQuery: options.resourceQuery || "",
resourceFragment: options.resourceFragment || ""
};
}

// Info from Factory
Expand Down
108 changes: 80 additions & 28 deletions lib/cache/ResolverCachePlugin.js
Expand Up @@ -128,6 +128,11 @@ class ResolverCachePlugin {
fileDependencies: new LazySet(),
contextDependencies: new LazySet()
};
let yieldResult;
if (typeof newResolveContext.yield === "function") {
yieldResult = [];
newResolveContext.yield = obj => yieldResult.push(obj);
}
const propagate = key => {
if (resolveContext[key]) {
addAllToSet(resolveContext[key], newResolveContext[key]);
Expand Down Expand Up @@ -155,15 +160,19 @@ class ResolverCachePlugin {
snapshotOptions,
(err, snapshot) => {
if (err) return callback(err);
const resolveResult = result || yieldResult;
if (!snapshot) {
if (result) return callback(null, result);
if (resolveResult) return callback(null, resolveResult);
return callback();
}
itemCache.store(new CacheEntry(result, snapshot), storeErr => {
if (storeErr) return callback(storeErr);
if (result) return callback(null, result);
callback();
});
itemCache.store(
new CacheEntry(resolveResult, snapshot),
storeErr => {
if (storeErr) return callback(storeErr);
if (resolveResult) return callback(null, resolveResult);
callback();
}
);
}
);
}
Expand All @@ -173,6 +182,8 @@ class ResolverCachePlugin {
factory(type, hook) {
/** @type {Map<string, (function(Error=, Object=): void)[]>} */
const activeRequests = new Map();
/** @type {Map<string, [function(Error=, Object=): void, function(Error=, Object=): void][]>} */
const activeRequestsWithYield = new Map();
hook.tap(
"ResolverCachePlugin",
/**
Expand All @@ -197,29 +208,63 @@ class ResolverCachePlugin {
if (request._ResolverCachePluginCacheMiss || !fileSystemInfo) {
return callback();
}
const identifier = `${type}${optionsIdent}${objectToString(
request,
!cacheWithContext
)}`;
const activeRequest = activeRequests.get(identifier);
if (activeRequest) {
activeRequest.push(callback);
return;
const withYield = typeof resolveContext.yield === "function";
const identifier = `${type}${
withYield ? "|yield" : "|default"
}${optionsIdent}${objectToString(request, !cacheWithContext)}`;

if (withYield) {
const activeRequest = activeRequestsWithYield.get(identifier);
if (activeRequest) {
activeRequest[0].push(callback);
activeRequest[1].push(resolveContext.yield);
return;
}
} else {
const activeRequest = activeRequests.get(identifier);
if (activeRequest) {
activeRequest.push(callback);
return;
}
}
const itemCache = cache.getItemCache(identifier, null);
let callbacks;
const done = (err, result) => {
if (callbacks === undefined) {
callback(err, result);
callbacks = false;
} else {
for (const callback of callbacks) {
callback(err, result);
}
activeRequests.delete(identifier);
callbacks = false;
}
};
let callbacks, yields;
const done = withYield
? (err, result) => {
if (callbacks === undefined) {
if (err) {
callback(err);
} else {
if (result)
for (const r of result) resolveContext.yield(r);
callback(null, null);
}
yields = undefined;
callbacks = false;
} else {
for (let i = 0; i < callbacks.length; i++) {
const cb = callbacks[i];
const yield_ = yields[i];
if (result) for (const r of result) yield_(r);
cb(null, null);
}
activeRequestsWithYield.delete(identifier);
yields = undefined;
callbacks = false;
}
}
: (err, result) => {
if (callbacks === undefined) {
callback(err, result);
callbacks = false;
} else {
for (const callback of callbacks) {
callback(err, result);
}
activeRequests.delete(identifier);
callbacks = false;
}
};
/**
* @param {Error=} err error if any
* @param {CacheEntry=} cacheEntry cache entry
Expand Down Expand Up @@ -276,7 +321,14 @@ class ResolverCachePlugin {
}
};
itemCache.get(processCacheResult);
if (callbacks === undefined) {
if (withYield && callbacks === undefined) {
callbacks = [callback];
yields = [resolveContext.yield];
activeRequestsWithYield.set(
identifier,
/** @type {[any, any]} */ ([callbacks, yields])
);
} else if (callbacks === undefined) {
callbacks = [callback];
activeRequests.set(identifier, callbacks);
}
Expand Down
104 changes: 44 additions & 60 deletions test/__snapshots__/StatsTestCases.basictest.js.snap
Expand Up @@ -737,107 +737,91 @@ exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1`
`;

exports[`StatsTestCases should print correct stats for context-independence 1`] = `
"asset main-589bc1e057939ec92ac8.js 11.9 KiB [emitted] [immutable] (name: main)
sourceMap main-589bc1e057939ec92ac8.js.map 11 KiB [emitted] [dev] (auxiliary name: main)
asset 769-07530fdd52740602e70b.js 515 bytes [emitted] [immutable]
sourceMap 769-07530fdd52740602e70b.js.map 197 bytes [emitted] [dev]
asset 9-b4bccb21688edf45317d.js 509 bytes [emitted] [immutable]
sourceMap 9-b4bccb21688edf45317d.js.map 194 bytes [emitted] [dev]
"asset main-1aad2f42f93e93c4e0b4.js 12.7 KiB [emitted] [immutable] (name: main)
sourceMap main-1aad2f42f93e93c4e0b4.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main)
asset 695-4dd37417c69a0af66bac.js 455 bytes [emitted] [immutable]
sourceMap 695-4dd37417c69a0af66bac.js.map 342 bytes [emitted] [dev]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./a/c/ ./a/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./a/c/a.js 18 bytes [optional] [built] [code generated]
./a/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/a) 240 bytes
./a/index.js (in Xdir/context-independence/a) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/a) 266 bytes
./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-589bc1e057939ec92ac8.js 11.9 KiB [emitted] [immutable] (name: main)
sourceMap main-589bc1e057939ec92ac8.js.map 11 KiB [emitted] [dev] (auxiliary name: main)
asset 769-07530fdd52740602e70b.js 515 bytes [emitted] [immutable]
sourceMap 769-07530fdd52740602e70b.js.map 197 bytes [emitted] [dev]
asset 9-b4bccb21688edf45317d.js 509 bytes [emitted] [immutable]
sourceMap 9-b4bccb21688edf45317d.js.map 194 bytes [emitted] [dev]
asset main-1aad2f42f93e93c4e0b4.js 12.7 KiB [emitted] [immutable] (name: main)
sourceMap main-1aad2f42f93e93c4e0b4.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main)
asset 695-4dd37417c69a0af66bac.js 455 bytes [emitted] [immutable]
sourceMap 695-4dd37417c69a0af66bac.js.map 342 bytes [emitted] [dev]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./b/c/ ./b/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./b/c/a.js 18 bytes [optional] [built] [code generated]
./b/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/b) 240 bytes
./b/index.js (in Xdir/context-independence/b) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/b) 266 bytes
./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-7f0549980a72a1b9fd5f.js 13.3 KiB [emitted] [immutable] (name: main)
asset main-488feb13e36da3e337fa.js 14.9 KiB [emitted] [immutable] (name: main)
asset 695-828eb5c7418e1b8270bb.js 1.5 KiB [emitted] [immutable]
asset 769-659ad7401e6724cb15a1.js 1.37 KiB [emitted] [immutable]
asset 9-6c68097207ea7c07deed.js 1.36 KiB [emitted] [immutable]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./a/c/ ./a/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./a/c/a.js 18 bytes [optional] [built] [code generated]
./a/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/a) 240 bytes
./a/index.js (in Xdir/context-independence/a) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/a) 266 bytes
./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-7f0549980a72a1b9fd5f.js 13.3 KiB [emitted] [immutable] (name: main)
asset main-488feb13e36da3e337fa.js 14.9 KiB [emitted] [immutable] (name: main)
asset 695-828eb5c7418e1b8270bb.js 1.5 KiB [emitted] [immutable]
asset 769-659ad7401e6724cb15a1.js 1.37 KiB [emitted] [immutable]
asset 9-6c68097207ea7c07deed.js 1.36 KiB [emitted] [immutable]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./b/c/ ./b/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./b/c/a.js 18 bytes [optional] [built] [code generated]
./b/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/b) 240 bytes
./b/index.js (in Xdir/context-independence/b) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/b) 266 bytes
./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-08902bb62cc1c5a8b5ba.js 12.8 KiB [emitted] [immutable] (name: main)
asset 769-3b995fff9a7c2e9ee43c.js 1.05 KiB [emitted] [immutable]
asset 9-839166a55905d163a772.js 1.05 KiB [emitted] [immutable]
asset main-c96ffcbdb3eefd9ed7c6.js 13.7 KiB [emitted] [immutable] (name: main)
asset 695-ace208366ce0ce2556ef.js 1.01 KiB [emitted] [immutable]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./a/c/ ./a/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./a/c/a.js 18 bytes [optional] [built] [code generated]
./a/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/a) 240 bytes
./a/index.js (in Xdir/context-independence/a) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/a) 266 bytes
./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-08902bb62cc1c5a8b5ba.js 12.8 KiB [emitted] [immutable] (name: main)
asset 769-3b995fff9a7c2e9ee43c.js 1.05 KiB [emitted] [immutable]
asset 9-839166a55905d163a772.js 1.05 KiB [emitted] [immutable]
asset main-c96ffcbdb3eefd9ed7c6.js 13.7 KiB [emitted] [immutable] (name: main)
asset 695-ace208366ce0ce2556ef.js 1.01 KiB [emitted] [immutable]
runtime modules 6.67 KiB 9 modules
runtime modules 6.6 KiB 9 modules
orphan modules 19 bytes [orphan] 1 module
built modules 436 bytes [built]
modules by layer 196 bytes
./b/c/ ./b/cc/ lazy ^\\\\.\\\\/.*$ namespace object 160 bytes [built] [code generated]
built modules 500 bytes [built]
modules by layer 234 bytes
./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated]
./b/c/a.js 18 bytes [optional] [built] [code generated]
./b/cc/b.js 18 bytes [optional] [built] [code generated]
modules by layer (in Xdir/context-independence/b) 240 bytes
./b/index.js (in Xdir/context-independence/b) 174 bytes [built] [code generated]
modules by layer (in Xdir/context-independence/b) 266 bytes
./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms"
`;
Expand Down
2 changes: 1 addition & 1 deletion test/statsCases/context-independence/a/index.js
@@ -1,4 +1,4 @@
console.log("test");
import("./chunk");
const module = Math.round(Math.random() * 100) % 2 === 0 ? "a" : "b";
import(`c/${module}`).then(({ default: d }) => console.log(d));
import(/* webpackMode: "eager" */`c/${module}`).then(({ default: d }) => console.log(d));
2 changes: 1 addition & 1 deletion test/statsCases/context-independence/b/index.js
@@ -1,4 +1,4 @@
console.log("test");
import("./chunk");
const module = Math.round(Math.random() * 100) % 2 === 0 ? "a" : "b";
import(`c/${module}`).then(({ default: d }) => console.log(d));
import(/* webpackMode: "eager" */`c/${module}`).then(({ default: d }) => console.log(d));

0 comments on commit cdfb610

Please sign in to comment.