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 * Show active modules count and one active module in progress message
*/ */
activeModules?: boolean; 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 * Show entries count in progress message
*/ */
@ -32,7 +40,7 @@ export interface ProgressPluginOptions {
*/ */
modules?: boolean; 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; modulesCount?: number;
/** /**

View File

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

View File

@ -13,6 +13,14 @@
"description": "Show active modules count and one active module in progress message", "description": "Show active modules count and one active module in progress message",
"type": "boolean" "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": { "entries": {
"description": "Show entries count in progress message", "description": "Show entries count in progress message",
"type": "boolean" "type": "boolean"
@ -30,7 +38,7 @@
"type": "boolean" "type": "boolean"
}, },
"modulesCount": { "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" "type": "number"
}, },
"profile": { "profile": {

View File

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