diff --git a/packages/react-dev-utils/formatWebpackMessages.js b/packages/react-dev-utils/formatWebpackMessages.js
index 1d0f7c5cdae..53a48e3fea1 100644
--- a/packages/react-dev-utils/formatWebpackMessages.js
+++ b/packages/react-dev-utils/formatWebpackMessages.js
@@ -13,18 +13,33 @@ function isLikelyASyntaxError(message) {
   return message.indexOf(friendlySyntaxErrorLabel) !== -1;
 }
 
+function cleanTerminalColors(input) {
+  // Regular expression to match ANSI escape codes
+  const ansiRegex = /\x1B\[[0-9;]*[a-zA-Z]/g;
+  // Remove ANSI escape codes from the input string
+  return input.replace(ansiRegex, '');
+}
+
 // Cleans up webpack error messages.
 function formatMessage(message) {
   let lines = [];
 
   if (typeof message === 'string') {
-    lines = message.split('\n');
+    lines = cleanTerminalColors(message).split('\n');
   } else if ('message' in message) {
-    lines = message['message'].split('\n');
+    lines = cleanTerminalColors(message['message']).split('\n');
+    // ensure message contains filename
+    if ('file' in message && !message['message'].includes(message.file)) {
+      lines.unshift("While building top file: " + message.file);
+    }  
   } else if (Array.isArray(message)) {
     message.forEach(message => {
       if ('message' in message) {
-        lines = message['message'].split('\n');
+        lines = cleanTerminalColors(message['message']).split('\n');
+        // ensure message contains filename
+        if ('file' in message && !message['message'].includes(message.file)) {
+          lines.unshift("While building top file: " + message.file);
+        }  
       }
     });
   }
diff --git a/packages/react-scripts/scripts/build.js b/packages/react-scripts/scripts/build.js
index 7a3a635a5d3..6b92148429b 100644
--- a/packages/react-scripts/scripts/build.js
+++ b/packages/react-scripts/scripts/build.js
@@ -173,8 +173,12 @@ function build(previousFileSizes) {
       if (messages.errors.length) {
         // Only keep the first error. Others are often indicative
         // of the same problem, but confuse the reader with noise.
-        if (messages.errors.length > 1) {
-          messages.errors.length = 1;
+        const re = /\S+:\d+:\d+/;  // check if error message has filename with line number, to not print errors with no filename or line number
+        for(let i = 0; i < messages.errors.length; i++) {
+          if(re.test(messages.errors[i])) {
+            messages.errors.length = i+1; 
+            break;
+          }
         }
         return reject(new Error(messages.errors.join('\n\n')));
       }