diff --git a/declarations/plugins/ProgressPlugin.d.ts b/declarations/plugins/ProgressPlugin.d.ts index d0fa1b45b..ee0b0f07e 100644 --- a/declarations/plugins/ProgressPlugin.d.ts +++ b/declarations/plugins/ProgressPlugin.d.ts @@ -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; /** diff --git a/lib/ProgressPlugin.js b/lib/ProgressPlugin.js index 7d3bc9925..7d891ddfb 100644 --- a/lib/ProgressPlugin.js +++ b/lib/ProgressPlugin.js @@ -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 }; diff --git a/schemas/plugins/ProgressPlugin.json b/schemas/plugins/ProgressPlugin.json index e3847c7e1..778fb04b2 100644 --- a/schemas/plugins/ProgressPlugin.json +++ b/schemas/plugins/ProgressPlugin.json @@ -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": { diff --git a/test/ProgressPlugin.test.js b/test/ProgressPlugin.test.js index d2334d0ad..14f12ae58 100644 --- a/test/ProgressPlugin.test.js +++ b/test/ProgressPlugin.test.js @@ -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");