From 93f5d16388604c6bfc17dcf9d565cef2d8c315db Mon Sep 17 00:00:00 2001 From: neverland Date: Sat, 25 Oct 2025 13:01:13 +0800 Subject: [PATCH 1/2] feat(browser-logs): add method name to error stack summary --- .../browser-logs/react-error/index.test.ts | 4 +-- .../browser-logs/vue-error/index.test.ts | 4 +-- packages/core/src/server/browserLogs.ts | 31 ++++++++++++++++--- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/e2e/cases/browser-logs/react-error/index.test.ts b/e2e/cases/browser-logs/react-error/index.test.ts index 4ae029c909..5a11c8bb6b 100644 --- a/e2e/cases/browser-logs/react-error/index.test.ts +++ b/e2e/cases/browser-logs/react-error/index.test.ts @@ -7,7 +7,7 @@ rspackTest( await gotoPage(page, rsbuild, '/undefinedError'); await rsbuild.expectLog( - `error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') (src/undefinedError.jsx:5:0)`, + `error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') at ComponentWithUndefinedError (src/undefinedError.jsx:5:0)`, { posix: true }, ); @@ -20,7 +20,7 @@ rspackTest( await gotoPage(page, rsbuild, '/eventError'); await page.click('button'); await rsbuild.expectLog( - `error [browser] Uncaught TypeError: Cannot read properties of null (reading 'someMethod') (src/eventError.jsx:6:0)`, + `error [browser] Uncaught TypeError: Cannot read properties of null (reading 'someMethod') at handleClick (src/eventError.jsx:6:0)`, { posix: true }, ); }, diff --git a/e2e/cases/browser-logs/vue-error/index.test.ts b/e2e/cases/browser-logs/vue-error/index.test.ts index d9fa9c489b..e3703dec20 100644 --- a/e2e/cases/browser-logs/vue-error/index.test.ts +++ b/e2e/cases/browser-logs/vue-error/index.test.ts @@ -7,14 +7,14 @@ rspackTest( await gotoPage(page, rsbuild, '/undefinedError'); await rsbuild.expectLog( - `error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') (src/UndefinedError.vue:2:0)`, + `error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') at Proxy.render (src/UndefinedError.vue:2:0)`, { posix: true }, ); await gotoPage(page, rsbuild, '/eventError'); await page.click('button'); await rsbuild.expectLog( - `error [browser] Uncaught TypeError: Cannot read properties of null (reading 'someMethod') (src/EventError.vue:8:0)`, + `error [browser] Uncaught TypeError: Cannot read properties of null (reading 'someMethod') at handleClick (src/EventError.vue:8:0)`, { posix: true }, ); }, diff --git a/packages/core/src/server/browserLogs.ts b/packages/core/src/server/browserLogs.ts index ecd351a7aa..cd98bcb00e 100644 --- a/packages/core/src/server/browserLogs.ts +++ b/packages/core/src/server/browserLogs.ts @@ -41,7 +41,10 @@ const findFirstUserFrame = (parsed: StackFrame[]) => { frame.column !== null && frame.lineNumber !== null && SCRIPT_REGEX.test(frame.file), - ) as { file: string; column: number; lineNumber: number } | undefined; + ) as + | (StackFrame & + Pick, 'file' | 'column' | 'lineNumber'>) + | undefined; }; const getOriginalPositionForFrame = async ( @@ -102,7 +105,10 @@ const resolveOriginalLocation = async ( return; } - return formatOriginalLocation(originalMapping, context); + return { + frame, + location: formatOriginalLocation(originalMapping, context), + }; }; const formatOriginalLocation = ( @@ -217,12 +223,29 @@ export const formatBrowserErrorLog = async ( if (message.stack) { switch (stackTrace) { case 'summary': { - const location = await resolveOriginalLocation( + const resolved = await resolveOriginalLocation( message.stack, fs, context, ); - log += location ? color.dim(` (${location})`) : ''; + + if (!resolved) { + break; + } + + const { frame, location } = resolved; + const { methodName } = frame; + + let suffix = ''; + + // exclude unknown method name and file path like `./src/App.tsx` + if (methodName !== '' && !/[\\/]/.test(methodName)) { + suffix += ` at ${methodName}`; + } + if (location) { + suffix += ` (${location})`; + } + log += suffix ? color.dim(suffix) : ''; break; } case 'full': { From cb31a4284a65ad9539284f4a4bbd430040fa2e6d Mon Sep 17 00:00:00 2001 From: neverland Date: Sat, 25 Oct 2025 13:03:58 +0800 Subject: [PATCH 2/2] fix --- website/docs/en/config/dev/browser-logs.mdx | 2 +- website/docs/zh/config/dev/browser-logs.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/en/config/dev/browser-logs.mdx b/website/docs/en/config/dev/browser-logs.mdx index ddf7eb9a42..856b1011dd 100644 --- a/website/docs/en/config/dev/browser-logs.mdx +++ b/website/docs/en/config/dev/browser-logs.mdx @@ -24,7 +24,7 @@ The browser will throw an error, and Rsbuild will forward this error to the term ```bash error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') - (src/App.jsx:3:0) + at handleClick (src/App.jsx:3:0) ``` ## Disabling diff --git a/website/docs/zh/config/dev/browser-logs.mdx b/website/docs/zh/config/dev/browser-logs.mdx index 8290657c0a..acad515f2b 100644 --- a/website/docs/zh/config/dev/browser-logs.mdx +++ b/website/docs/zh/config/dev/browser-logs.mdx @@ -25,7 +25,7 @@ const App = () => { ```bash error [browser] Uncaught TypeError: Cannot read properties of undefined (reading 'name') - (src/App.jsx:3:0) + at handleClick (src/App.jsx:3:0) ``` ## 禁用