diff --git a/packages/next/src/build/swc/options.ts b/packages/next/src/build/swc/options.ts index d81375778e019..2751efbdec3e2 100644 --- a/packages/next/src/build/swc/options.ts +++ b/packages/next/src/build/swc/options.ts @@ -482,6 +482,11 @@ export function getLoaderSWCOptions({ options.isPageFile = false options.optimizeServerReact = undefined options.cjsRequireOptimizer = undefined + // Disable optimizer for node_modules in app browser layer, to avoid unnecessary replacement. + // e.g. typeof window could result differently in js worker or browser. + if (options.jsc.transform.optimizer.globals?.typeofs) { + delete options.jsc.transform.optimizer.globals.typeofs.window + } } return options diff --git a/test/e2e/app-dir/app-external/app-external.test.ts b/test/e2e/app-dir/app-external/app-external.test.ts index 91c95ba2285b9..44576abcef0bc 100644 --- a/test/e2e/app-dir/app-external/app-external.test.ts +++ b/test/e2e/app-dir/app-external/app-external.test.ts @@ -1,5 +1,5 @@ import { createNextDescribe } from 'e2e-utils' -import { check, hasRedbox, shouldRunTurboDevTest } from 'next-test-utils' +import { check, hasRedbox, retry, shouldRunTurboDevTest } from 'next-test-utils' async function resolveStreamResponse(response: any, onData?: any) { let result = '' @@ -153,6 +153,19 @@ createNextDescribe( ).toMatch(/^__myFont_.{6}, __myFont_Fallback_.{6}$/) }) + it('should not apply swc optimizer transform for external packages in browser layer', async () => { + const browser = await next.browser('/browser') + expect(await browser.elementByCss('#worker-state').text()).toBe('default') + + await browser.elementByCss('button').click() + + await retry(async () => { + expect(await browser.elementByCss('#worker-state').text()).toBe( + 'worker.js:browser-module/other' + ) + }) + }) + describe('react in external esm packages', () => { it('should use the same react in client app', async () => { const html = await next.render('/esm/client') diff --git a/test/e2e/app-dir/app-external/app/browser/page.js b/test/e2e/app-dir/app-external/app/browser/page.js new file mode 100644 index 0000000000000..5fa1381c6df57 --- /dev/null +++ b/test/e2e/app-dir/app-external/app/browser/page.js @@ -0,0 +1,22 @@ +'use client' +import { useState } from 'react' + +export default function Home() { + const [state, setState] = useState('default') + return ( +
+ +

Worker state:

+

{state}

+
+ ) +} diff --git a/test/e2e/app-dir/app-external/app/browser/worker.js b/test/e2e/app-dir/app-external/app/browser/worker.js new file mode 100644 index 0000000000000..503cc8e702450 --- /dev/null +++ b/test/e2e/app-dir/app-external/app/browser/worker.js @@ -0,0 +1,3 @@ +import { value } from 'browser-module' + +self.postMessage('worker.js:' + value) diff --git a/test/e2e/app-dir/app-external/node_modules_bak/browser-module/browser.js b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/browser.js new file mode 100644 index 0000000000000..60215f6777c41 --- /dev/null +++ b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/browser.js @@ -0,0 +1,4 @@ +'use client' + +export const value = + 'browser-module/' + (typeof window !== 'undefined' ? 'browser' : 'other') diff --git a/test/e2e/app-dir/app-external/node_modules_bak/browser-module/index.js b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/index.js new file mode 100644 index 0000000000000..35b818f5f076e --- /dev/null +++ b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/index.js @@ -0,0 +1 @@ +export const value = 'browser-module/index' diff --git a/test/e2e/app-dir/app-external/node_modules_bak/browser-module/package.json b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/package.json new file mode 100644 index 0000000000000..fbfb874e865ce --- /dev/null +++ b/test/e2e/app-dir/app-external/node_modules_bak/browser-module/package.json @@ -0,0 +1,7 @@ +{ + "type": "module", + "exports": { + "browser": "./browser.js", + "default": "./index.js" + } +} diff --git a/test/turbopack-tests-manifest.json b/test/turbopack-tests-manifest.json index 67b588339fcbe..eb5bb2052743f 100644 --- a/test/turbopack-tests-manifest.json +++ b/test/turbopack-tests-manifest.json @@ -2567,7 +2567,8 @@ ], "failed": [ "app dir - external dependency server actions should compile server actions from node_modules in client components", - "app dir - external dependency should be able to opt-out 3rd party packages being bundled in server components" + "app dir - external dependency should be able to opt-out 3rd party packages being bundled in server components", + "app dir - external dependency should not apply swc optimizer transform for external packages in browser layer" ], "pending": [], "flakey": [],