Skip to content

Commit c5eccb2

Browse files
fix: avoid cache invalidation using ProgressPlugin and importModule
1 parent 90ea8b8 commit c5eccb2

File tree

4 files changed

+76
-11
lines changed

4 files changed

+76
-11
lines changed

lib/ProgressPlugin.js

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,18 @@ const { contextify } = require("./util/identifier");
1515
/** @typedef {import("../declarations/plugins/ProgressPlugin").HandlerFunction} HandlerFunction */
1616
/** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginArgument} ProgressPluginArgument */
1717
/** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginOptions} ProgressPluginOptions */
18+
/** @typedef {import("./Compilation").FactorizeModuleOptions} FactorizeModuleOptions */
1819
/** @typedef {import("./Dependency")} Dependency */
1920
/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
2021
/** @typedef {import("./Module")} Module */
22+
/** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
2123
/** @typedef {import("./logging/Logger").Logger} Logger */
2224

25+
/**
26+
* @template T, K, R
27+
* @typedef {import("./util/AsyncQueue")<T, K, R>} AsyncQueue
28+
*/
29+
2330
/**
2431
* @typedef {object} CountsData
2532
* @property {number} modulesCount modules count
@@ -217,7 +224,9 @@ class ProgressPlugin {
217224
let lastDependenciesCount = 0;
218225
let lastEntriesCount = 0;
219226
let modulesCount = 0;
227+
let skippedModulesCount = 0;
220228
let dependenciesCount = 0;
229+
let skippedDependenciesCount = 0;
221230
let entriesCount = 1;
222231
let doneModules = 0;
223232
let doneDependencies = 0;
@@ -298,7 +307,15 @@ class ProgressPlugin {
298307
lastUpdate = Date.now();
299308
};
300309

301-
const factorizeAdd = () => {
310+
/**
311+
* @template T
312+
* @param {AsyncQueue<FactorizeModuleOptions, string, Module | ModuleFactoryResult>} factorizeQueue async queue
313+
* @param {T} _item item
314+
*/
315+
const factorizeAdd = (factorizeQueue, _item) => {
316+
if (factorizeQueue.getContext() === "import-module") {
317+
skippedDependenciesCount++;
318+
}
302319
dependenciesCount++;
303320
if (dependenciesCount < 50 || dependenciesCount % 100 === 0)
304321
updateThrottled();
@@ -310,7 +327,15 @@ class ProgressPlugin {
310327
updateThrottled();
311328
};
312329

313-
const moduleAdd = () => {
330+
/**
331+
* @template T
332+
* @param {AsyncQueue<Module, string, Module>} addModuleQueue async queue
333+
* @param {T} _item item
334+
*/
335+
const moduleAdd = (addModuleQueue, _item) => {
336+
if (addModuleQueue.getContext() === "import-module") {
337+
skippedModulesCount++;
338+
}
314339
modulesCount++;
315340
if (modulesCount < 50 || modulesCount % 100 === 0) updateThrottled();
316341
};
@@ -397,12 +422,19 @@ class ProgressPlugin {
397422
if (compilation.compiler.isChild()) return Promise.resolve();
398423
return /** @type {Promise<CountsData>} */ (cacheGetPromise).then(
399424
async oldData => {
425+
const realModulesCount = modulesCount - skippedModulesCount;
426+
const realDependenciesCount =
427+
dependenciesCount - skippedDependenciesCount;
428+
400429
if (
401430
!oldData ||
402-
oldData.modulesCount !== modulesCount ||
403-
oldData.dependenciesCount !== dependenciesCount
431+
oldData.modulesCount !== realModulesCount ||
432+
oldData.dependenciesCount !== realDependenciesCount
404433
) {
405-
await cache.storePromise({ modulesCount, dependenciesCount });
434+
await cache.storePromise({
435+
modulesCount: realModulesCount,
436+
dependenciesCount: realDependenciesCount
437+
});
406438
}
407439
}
408440
);
@@ -413,19 +445,25 @@ class ProgressPlugin {
413445
lastModulesCount = modulesCount;
414446
lastEntriesCount = entriesCount;
415447
lastDependenciesCount = dependenciesCount;
416-
modulesCount = dependenciesCount = entriesCount = 0;
448+
modulesCount =
449+
skippedModulesCount =
450+
dependenciesCount =
451+
skippedDependenciesCount =
452+
entriesCount =
453+
0;
417454
doneModules = doneDependencies = doneEntries = 0;
418455

419-
compilation.factorizeQueue.hooks.added.tap(
420-
"ProgressPlugin",
421-
factorizeAdd
456+
compilation.factorizeQueue.hooks.added.tap("ProgressPlugin", item =>
457+
factorizeAdd(compilation.factorizeQueue, item)
422458
);
423459
compilation.factorizeQueue.hooks.result.tap(
424460
"ProgressPlugin",
425461
factorizeDone
426462
);
427463

428-
compilation.addModuleQueue.hooks.added.tap("ProgressPlugin", moduleAdd);
464+
compilation.addModuleQueue.hooks.added.tap("ProgressPlugin", item =>
465+
moduleAdd(compilation.addModuleQueue, item)
466+
);
429467
compilation.processDependenciesQueue.hooks.result.tap(
430468
"ProgressPlugin",
431469
moduleDone

lib/dependencies/LoaderPlugin.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ class LoaderPlugin {
173173
)
174174
);
175175
}
176+
177+
const oldFactorizeQueueContext =
178+
compilation.factorizeQueue.getContext();
179+
compilation.factorizeQueue.setContext("import-module");
180+
const oldAddModuleQueueContext =
181+
compilation.addModuleQueue.getContext();
182+
compilation.addModuleQueue.setContext("import-module");
176183
compilation.buildQueue.increaseParallelism();
177184
compilation.handleModuleCreation(
178185
{
@@ -189,6 +196,8 @@ class LoaderPlugin {
189196
checkCycle: true
190197
},
191198
err => {
199+
compilation.factorizeQueue.setContext(oldFactorizeQueueContext);
200+
compilation.addModuleQueue.setContext(oldAddModuleQueueContext);
192201
compilation.buildQueue.decreaseParallelism();
193202
if (err) {
194203
return callback(err);

lib/util/AsyncQueue.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ class AsyncQueue {
6868
* @param {object} options options object
6969
* @param {string=} options.name name of the queue
7070
* @param {number=} options.parallelism how many items should be processed at once
71+
* @param {string=} options.context context of execution
7172
* @param {AsyncQueue<any, any, any>=} options.parent parent queue, which will have priority over this queue and with shared parallelism
7273
* @param {getKey<T, K>=} options.getKey extract key from item
7374
* @param {Processor<T, R>} options.processor async function to process items
7475
*/
75-
constructor({ name, parallelism, parent, processor, getKey }) {
76+
constructor({ name, context, parallelism, parent, processor, getKey }) {
7677
this._name = name;
78+
this._context = context || "normal";
7779
this._parallelism = parallelism || 1;
7880
this._processor = processor;
7981
this._getKey =
@@ -115,6 +117,20 @@ class AsyncQueue {
115117
this._ensureProcessing = this._ensureProcessing.bind(this);
116118
}
117119

120+
/**
121+
* @returns {string} context of execution
122+
*/
123+
getContext() {
124+
return this._context;
125+
}
126+
127+
/**
128+
* @param {string} value context of execution
129+
*/
130+
setContext(value) {
131+
this._context = value;
132+
}
133+
118134
/**
119135
* @param {T} item an item
120136
* @param {Callback<R>} callback callback function

types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ declare abstract class AsyncQueue<T, K, R> {
407407
[T, undefined | null | WebpackError, undefined | null | R]
408408
>;
409409
};
410+
getContext(): string;
411+
setContext(value: string): void;
410412
add(item: T, callback: CallbackAsyncQueue<R>): void;
411413
invalidate(item: T): void;
412414

0 commit comments

Comments
 (0)