Skip to content

Commit

Permalink
Fix extra swc optimizer applied to node_modules in browser layer
Browse files Browse the repository at this point in the history
  • Loading branch information
huozhi committed Feb 14, 2024
1 parent 56d35ed commit c3b4d8b
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 1 deletion.
3 changes: 3 additions & 0 deletions packages/next/src/build/swc/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,9 @@ 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.
options.jsc.transform.optimizer = null
}

return options
Expand Down
15 changes: 14 additions & 1 deletion test/e2e/app-dir/app-external/app-external.test.ts
Original file line number Diff line number Diff line change
@@ -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 = ''
Expand Down Expand Up @@ -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')
Expand Down
22 changes: 22 additions & 0 deletions test/e2e/app-dir/app-external/app/browser/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
'use client'
import { useState } from 'react'

export default function Home() {
const [state, setState] = useState('default')
return (
<div>
<button
onClick={() => {
const worker = new Worker(new URL('./worker', import.meta.url))
worker.addEventListener('message', (event) => {
setState(event.data)
})
}}
>
Get web worker data
</button>
<p>Worker state: </p>
<p id="worker-state">{state}</p>
</div>
)
}
3 changes: 3 additions & 0 deletions test/e2e/app-dir/app-external/app/browser/worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { value } from 'browser-module'

self.postMessage('worker.js:' + value)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
'use client'

export const value =
'browser-module/' + (typeof window !== 'undefined' ? 'browser' : 'other')
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const value = 'browser-module/index'
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "module",
"exports": {
"browser": "./browser.js",
"default": "./index.js"
}
}

0 comments on commit c3b4d8b

Please sign in to comment.