Skip to content

Commit

Permalink
Fix mixed exports in server component with barrel optimization (#64894)
Browse files Browse the repository at this point in the history
### What

* Remove the change added in #64467, but still kept tests.
* Add more tests for mixed imports (component and function) from shared
component with `optimizePackageImports`

### Why

The fix in #64467 was not correct, as mixing `export *` with `"use
client"` should error if Next.js detect it properly.
When there's mixed exports, that a shared function will become a client
reference if the target file inherits the client boundary.

The original issue #64467 fixed was actually related to tree-shaking,
which is fixed in #64681.

Closes NEXT-3197
  • Loading branch information
huozhi authored Apr 23, 2024
1 parent c251de8 commit 3fa9cb7
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 6 deletions.
2 changes: 0 additions & 2 deletions packages/next/src/build/webpack/loaders/next-barrel-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,6 @@ async function getBarrelMapping(
if (targetMatches) {
// Merge the export list
exportList = exportList.concat(targetMatches.exportList)
// Inherit the client boundary from the target matched file
isClientEntry = isClientEntry || targetMatches.isClientEntry
}
})
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { buttonStyle, Button } from 'mixed-lib'

export default function Page() {
return (
<div>
<Button id="component" style={buttonStyle()} />
</div>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ describe('Skipped in Turbopack', () => {
},
({ next }) => {
it('should build successfully', async () => {
// Ensure that MUI is working
const $ = await next.render$('/')
expect(await $('#client-mod').text()).toContain('client:default')
})

it('should handle mixed imports from barrel optimized lib correctly', async () => {
const $ = await next.render$('/mixed-barrel-imports')
expect(await $('#component').attr('style')).toContain('color:blue')
})
}
)
})
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module.exports = {
experimental: {
optimizePackageImports: ['my-lib'],
optimizePackageImports: ['my-lib', 'mixed-lib'],
},
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 3fa9cb7

Please sign in to comment.