add dependencies to ProgressPlugin

include module dependencies in module progress
improve progress percentage calculation
This commit is contained in:
Tobias Koppers 2019-11-12 11:33:15 +01:00
parent 8fb1269cf1
commit 552ca1e3b9
4 changed files with 76 additions and 19 deletions

View File

@ -19,6 +19,14 @@ export interface ProgressPluginOptions {
* Show active modules count and one active module in progress message
*/
activeModules?: boolean;
/**
* Show dependencies count in progress message
*/
dependencies?: boolean;
/**
* Minimum dependencies count to start with. For better progress calculation. Default: 10000
*/
dependenciesCount?: number;
/**
* Show entries count in progress message
*/
@ -32,7 +40,7 @@ export interface ProgressPluginOptions {
*/
modules?: boolean;
/**
* Minimum modules count to start with. Only for mode=modules. Default: 500
* Minimum modules count to start with. For better progress calculation. Default: 5000
*/
modulesCount?: number;
/**

View File

@ -14,6 +14,10 @@ const MultiCompiler = require("./MultiCompiler");
/** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginArgument} ProgressPluginArgument */
/** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginOptions} ProgressPluginOptions */
const median3 = (a, b, c) => {
return a + b + c - Math.max(a, b, c) - Math.min(a, b, c);
};
const createDefaultHandler = (profile, logger) => {
let lastState;
let lastStateTime;
@ -90,8 +94,10 @@ class ProgressPlugin {
this.profile = options.profile;
this.handler = options.handler;
this.modulesCount = options.modulesCount;
this.dependenciesCount = options.dependenciesCount;
this.showEntries = options.entries;
this.showModules = options.modules;
this.showDependencies = options.dependencies;
this.showActiveModules = options.activeModules;
}
@ -140,16 +146,19 @@ class ProgressPlugin {
* @returns {void}
*/
_applyOnCompiler(compiler, handler) {
const { modulesCount } = this;
const showEntries = this.showEntries;
const showModules = this.showModules;
const showDependencies = this.showDependencies;
const showActiveModules = this.showActiveModules;
let lastActiveModule = "";
let lastModulesCount = 0;
let lastModulesCount = this.modulesCount;
let lastDependenciesCount = this.dependenciesCount;
let lastEntriesCount = 0;
let moduleCount = modulesCount;
let modulesCount = 0;
let dependenciesCount = 0;
let entriesCount = 1;
let doneModules = 0;
let doneDependencies = 0;
let doneEntries = 0;
const activeModules = new Set();
let lastUpdate = 0;
@ -162,16 +171,24 @@ class ProgressPlugin {
/** @type {string[]} */
const items = [];
const percentByModules =
doneModules / Math.max(lastModulesCount, moduleCount);
doneModules / Math.max(lastModulesCount, modulesCount);
const percentByEntries =
doneEntries / Math.max(lastEntriesCount, entriesCount);
const percentByDependencies =
doneDependencies / Math.max(lastDependenciesCount, dependenciesCount);
const percentage =
0.1 + Math.max(percentByModules, percentByEntries) * 0.6;
0.1 +
median3(percentByModules, percentByEntries, percentByDependencies) *
0.6;
if (showEntries) {
items.push(`${doneEntries}/${entriesCount} entries`);
}
if (showDependencies) {
items.push(`${doneDependencies}/${dependenciesCount} dependencies`);
}
if (showModules) {
items.push(`${doneModules}/${moduleCount} modules`);
items.push(`${doneModules}/${modulesCount} modules`);
}
if (showActiveModules) {
items.push(`${activeModules.size} active`);
@ -181,9 +198,19 @@ class ProgressPlugin {
lastUpdate = Date.now();
};
const moduleAdd = module => {
moduleCount++;
if (moduleCount % 100 === 0) updateThrottled();
const factorizeAdd = () => {
dependenciesCount++;
if (dependenciesCount % 100 === 0) updateThrottled();
};
const factorizeDone = () => {
doneDependencies++;
if (doneDependencies % 100 === 0) updateThrottled();
};
const moduleAdd = () => {
modulesCount++;
if (modulesCount % 100 === 0) updateThrottled();
};
const moduleBuild = module => {
@ -228,17 +255,29 @@ class ProgressPlugin {
compiler.hooks.compilation.tap("ProgressPlugin", compilation => {
if (compilation.compiler.isChild()) return;
lastModulesCount = moduleCount;
lastModulesCount = modulesCount;
lastEntriesCount = entriesCount;
moduleCount = entriesCount = 0;
doneModules = doneEntries = 0;
lastDependenciesCount = dependenciesCount;
modulesCount = dependenciesCount = entriesCount = 0;
doneModules = doneDependencies = doneEntries = 0;
handler(0, "compiling");
compilation.factorizeQueue.hooks.added.tap(
"ProgressPlugin",
factorizeAdd
);
compilation.factorizeQueue.hooks.result.tap(
"ProgressPlugin",
factorizeDone
);
compilation.addModuleQueue.hooks.added.tap("ProgressPlugin", moduleAdd);
compilation.processDependenciesQueue.hooks.result.tap(
"ProgressPlugin",
moduleDone
);
compilation.hooks.buildModule.tap("ProgressPlugin", moduleBuild);
compilation.hooks.failedModule.tap("ProgressPlugin", moduleDone);
compilation.hooks.succeedModule.tap("ProgressPlugin", moduleDone);
compilation.hooks.stillValidModule.tap("ProgressPlugin", moduleDone);
compilation.hooks.addEntry.tap("ProgressPlugin", entryAdd);
compilation.hooks.failedEntry.tap("ProgressPlugin", entryDone);
@ -341,8 +380,10 @@ class ProgressPlugin {
ProgressPlugin.defaultOptions = {
profile: false,
modulesCount: 500,
modulesCount: 5000,
dependenciesCount: 10000,
modules: true,
dependencies: true,
activeModules: false,
entries: true
};

View File

@ -13,6 +13,14 @@
"description": "Show active modules count and one active module in progress message",
"type": "boolean"
},
"dependencies": {
"description": "Show dependencies count in progress message",
"type": "boolean"
},
"dependenciesCount": {
"description": "Minimum dependencies count to start with. For better progress calculation. Default: 10000",
"type": "number"
},
"entries": {
"description": "Show entries count in progress message",
"type": "boolean"
@ -30,7 +38,7 @@
"type": "boolean"
},
"modulesCount": {
"description": "Minimum modules count to start with. Only for mode=modules. Default: 500",
"description": "Minimum modules count to start with. For better progress calculation. Default: 5000",
"type": "number"
},
"profile": {

View File

@ -41,7 +41,7 @@ describe("ProgressPlugin", function() {
"trims each detail string equally"
);
expect(logs).toContain(
"10% ...ding ...ries ...ules ...tive",
"10% ...ding ...ries ...cies ...ules",
"remove empty arguments and omit arguments when no space"
);
expect(logs).toContain("92% after chunk asset optimization");