Skip to content

Commit

Permalink
Prefer module fields for RSC server layer (#51179)
Browse files Browse the repository at this point in the history
Follow up for #50548 

There're some packages like `aws-sdk-js-v3` which doesn't have a exports field yet: 

```
  "main": "./dist-cjs/index.js",
  "types": "./dist-types/index.d.ts",
  "module": "./dist-es/index.js",
 ```
 
 This PR let u pick up by the js assets based on main fields, will prefer `"module"` field instead of `"main"`
 
 Closes NEXT-1286
  • Loading branch information
huozhi committed Jun 12, 2023
1 parent bcb63f3 commit 74225d1
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 17 deletions.
4 changes: 4 additions & 0 deletions packages/next/src/build/webpack-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1941,6 +1941,10 @@ export default async function getBaseWebpackConfig(
],
},
resolve: {
mainFields: isEdgeServer
? mainFieldsPerCompiler[COMPILER_NAMES.edgeServer]
: // Prefer module fields over main fields for isomorphic packages on server layer
['module', 'main'],
conditionNames: reactServerCondition,
alias: {
// If missing the alias override here, the default alias will be used which aliases
Expand Down
33 changes: 16 additions & 17 deletions test/e2e/app-dir/app-external/app-external.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,23 @@ createNextDescribe(
})

it('should resolve 3rd party package exports based on the react-server condition', async () => {
await next
.fetch('/react-server/3rd-party-package')
.then(async (response) => {
const result = await resolveStreamResponse(response)

// Package should be resolved based on the react-server condition,
// as well as package's internal & external dependencies.
expect(result).toContain(
'Server: index.react-server:react.subset:dep.server'
)
expect(result).toContain(
'Client: index.default:react.full:dep.default'
)
const $ = await next.render$('/react-server/3rd-party-package')

const result = $('body').text()

// Package should be resolved based on the react-server condition,
// as well as package's internal & external dependencies.
expect(result).toContain(
'Server: index.react-server:react.subset:dep.server'
)
expect(result).toContain('Client: index.default:react.full:dep.default')

// Subpath exports should be resolved based on the condition too.
expect(result).toContain('Server subpath: subpath.react-server')
expect(result).toContain('Client subpath: subpath.default')

// Subpath exports should be resolved based on the condition too.
expect(result).toContain('Server subpath: subpath.react-server')
expect(result).toContain('Client subpath: subpath.default')
})
// Prefer `module` field for isomorphic packages.
expect($('#main-field').text()).toContain('server-module-field:module')
})

it('should correctly collect global css imports and mark them as side effects', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import v from 'conditional-exports'
import v1 from 'conditional-exports/subpath'
import { name as serverFieldName } from 'server-module-field'

import Client from './client'

Expand All @@ -11,6 +12,8 @@ export default function Page() {
{`Server subpath: ${v1}`}
<br />
<Client />
<br />
<div id="main-field">{`Server module field: ${serverFieldName}`}</div>
</div>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exports.name = 'server-module-field:main'
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const name = 'server-module-field:module'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"main": "./index.cjs",
"module": "./index.esm.js"
}

0 comments on commit 74225d1

Please sign in to comment.