diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx index 3e408f1cefe6..08fdab14c86a 100644 --- a/packages/next/client/index.tsx +++ b/packages/next/client/index.tsx @@ -702,6 +702,7 @@ if (process.env.__NEXT_RSC) { writer.write(encoder.encode(val)) }) buffer.length = 0 + serverDataBuffer.delete(key) } serverDataWriter.set(key, writer) } diff --git a/test/integration/react-streaming-and-server-components/app/pages/index.server.js b/test/integration/react-streaming-and-server-components/app/pages/index.server.js index 4874b99a3422..cec07820c64b 100644 --- a/test/integration/react-streaming-and-server-components/app/pages/index.server.js +++ b/test/integration/react-streaming-and-server-components/app/pages/index.server.js @@ -1,4 +1,5 @@ import Foo from '../components/foo.client' +import Link from 'next/link' const envVar = process.env.ENV_VAR_TEST const headerKey = 'x-next-test-client' @@ -13,6 +14,9 @@ export default function Index({ header, router }) {
+ + refresh + ) } diff --git a/test/integration/react-streaming-and-server-components/test/rsc.js b/test/integration/react-streaming-and-server-components/test/rsc.js index 2cccad780122..604073c3930f 100644 --- a/test/integration/react-streaming-and-server-components/test/rsc.js +++ b/test/integration/react-streaming-and-server-components/test/rsc.js @@ -38,7 +38,7 @@ export default function (context, { runtime, env }) { page.on('request', (request) => { requestsCount++ const url = request.url() - if (/__flight__=1/.test(url)) { + if (/\?__flight__=1/.test(url)) { hasFlightRequest = true } }) @@ -95,9 +95,39 @@ export default function (context, { runtime, env }) { }) } - // For prod build, the directory contains the build ID so it's not deterministic. - // Only enable it for dev for now. + it('should refresh correctly with next/link', async () => { + // Select the button which is not hidden but rendered + const selector = '#__next #refresh' + let hasFlightRequest = false + const browser = await webdriver(context.appPort, '/', { + beforePageLoad(page) { + page.on('request', (request) => { + const url = request.url() + if (/\?__flight__=1/.test(url)) { + hasFlightRequest = true + } + }) + }, + }) + + // wait for hydration + await new Promise((res) => setTimeout(res, 1000)) + if (env === 'dev') { + expect(hasFlightRequest).toBe(false) + } + await browser.elementByCss(selector).click() + // wait for re-hydration + await new Promise((res) => setTimeout(res, 1000)) + if (env === 'dev') { + expect(hasFlightRequest).toBe(true) + } + const refreshText = await browser.elementByCss(selector).text() + expect(refreshText).toBe('refresh') + }) + if (env === 'dev') { + // For prod build, the directory contains the build ID so it's not deterministic. + // Only enable it for dev for now. it('should not bundle external imports into client builds for RSC', async () => { const html = await renderViaHTTP(context.appPort, '/external-imports') expect(html).toContain('date:')