Skip to content

Commit

Permalink
Fix edge entry layer resolution bug (#41757)
Browse files Browse the repository at this point in the history
By default the edge page entry is in the client layer because it bundles Next.js. It's a virtual loader (edge-ssr-loader) but that makes the SWC loader think the page's source is a client component.

We use the resource query `__edge_ssr_entry__` to convert it to the server layer but we need to add that condition to the SWC loader too.

## Bug

- [ ] Related issues linked using `fixes #number`
- [x] Integration tests added
- [ ] Errors have a helpful link attached, see `contributing.md`

## Feature

- [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR.
- [ ] Related issues linked using `fixes #number`
- [ ] Integration tests added
- [ ] Documentation added
- [ ] Telemetry added. In case of a feature if it's used or not.
- [ ] Errors have a helpful link attached, see `contributing.md`

## Documentation / Examples

- [ ] Make sure the linting passes by running `pnpm lint`
- [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
  • Loading branch information
shuding committed Oct 25, 2022
1 parent 8678865 commit c124cab
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 10 deletions.
26 changes: 16 additions & 10 deletions packages/next/build/webpack-config.ts
Expand Up @@ -729,6 +729,16 @@ export default async function getBaseWebpackConfig(
babel: getBabelOrSwcLoader(),
}

const swcLoaderForRSC = hasServerComponents
? useSWCLoader
? getSwcLoader({ isServerLayer: true })
: // When using Babel, we will have to add the SWC loader
// as an additional pass to handle RSC correctly.
// This will cause some performance overhead but
// acceptable as Babel will not be recommended.
[getSwcLoader({ isServerLayer: true }), getBabelLoader()]
: []

const pageExtensions = config.pageExtensions

const outputPath =
Expand Down Expand Up @@ -1789,16 +1799,12 @@ export default async function getBaseWebpackConfig(
test: codeCondition.test,
issuerLayer: WEBPACK_LAYERS.server,
exclude: [staticGenerationAsyncStorageRegex],
use: useSWCLoader
? getSwcLoader({ isServerLayer: true })
: // When using Babel, we will have to add the SWC loader
// as an additional pass to handle RSC correctly.
// This will cause some performance overhead but
// acceptable as Babel will not be recommended.
[
getSwcLoader({ isServerLayer: true }),
getBabelLoader(),
],
use: swcLoaderForRSC,
},
{
test: codeCondition.test,
resourceQuery: /__edge_ssr_entry__/,
use: swcLoaderForRSC,
},
]
: []),
Expand Down
8 changes: 8 additions & 0 deletions test/e2e/app-dir/app/app/edge-apis/cookies/page.js
@@ -0,0 +1,8 @@
import { cookies } from 'next/headers'

export const runtime = 'experimental-edge'

export default function Page() {
cookies()
return <h1>Hello!</h1>
}
5 changes: 5 additions & 0 deletions test/e2e/app-dir/index.test.ts
Expand Up @@ -955,6 +955,11 @@ describe('app dir', () => {
}
})

it('should retrieve cookies in a server component in the edge runtime', async () => {
const res = await fetchViaHTTP(next.url, '/edge-apis/cookies')
expect(await res.text()).toInclude('Hello')
})

it('should access cookies on <Link /> navigation', async () => {
const browser = await webdriver(next.url, '/navigation')

Expand Down

0 comments on commit c124cab

Please sign in to comment.