diff --git a/lib/ProgressPlugin.js b/lib/ProgressPlugin.js index 6385a7d9b..c77b20164 100644 --- a/lib/ProgressPlugin.js +++ b/lib/ProgressPlugin.js @@ -68,8 +68,8 @@ const createDefaultHandler = profile => { const diff = now - lastStateTime; if (diff >= 1) { const stateMsg = `${diff}ms ${lastState}`; - goToLineStart(stateMsg); - process.stderr.write(stateMsg + "\n"); + goToLineStartAndWrite(stateMsg); + process.stderr.write("\n"); lineCaretPosition = 0; } } @@ -78,14 +78,13 @@ const createDefaultHandler = profile => { } } if (lastMessage !== msg) { - goToLineStart(msg); msg = msg.substring(0, maxLineLength); - process.stderr.write(msg); + goToLineStartAndWrite(msg); lastMessage = msg; } }; - const goToLineStart = nextMessage => { + const goToLineStartAndWrite = nextMessage => { let str = ""; for (; lineCaretPosition > nextMessage.length; lineCaretPosition--) { str += "\b \b"; @@ -94,7 +93,7 @@ const createDefaultHandler = profile => { str += "\b"; } lineCaretPosition = nextMessage.length; - if (str) process.stderr.write(str); + if (str) process.stderr.write(str + nextMessage); }; return defaultHandler; @@ -193,6 +192,11 @@ class ProgressPlugin { let doneModules = 0; let doneEntries = 0; const activeModules = new Set(); + let lastUpdate = 0; + + const updateThrottled = () => { + if (lastUpdate + 500 < Date.now()) update(); + }; const update = () => { /** @type {string[]} */ @@ -214,11 +218,12 @@ class ProgressPlugin { items.push(lastActiveModule); } handler(percentage, "building", ...items); + lastUpdate = Date.now(); }; const moduleAdd = module => { moduleCount++; - if (moduleCount % 100 === 0) update(); + if (moduleCount % 100 === 0) updateThrottled(); }; const moduleBuild = module => { @@ -234,7 +239,7 @@ class ProgressPlugin { const entryAdd = (entry, name) => { entriesCount++; - if (entriesCount % 10 === 0) update(); + if (entriesCount % 10 === 0) updateThrottled(); }; const moduleDone = module => { @@ -248,11 +253,12 @@ class ProgressPlugin { for (const m of activeModules) { lastActiveModule = m; } - if (doneModules % 100 !== 0) update(); + update(); + return; } } } - if (doneModules % 100 === 0) update(); + if (doneModules % 100 === 0) updateThrottled(); }; const entryDone = (entry, name) => {