diff --git a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/render.ts b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/render.ts index 70a3ae3596ef74e..78bb79ab5903cd2 100644 --- a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/render.ts +++ b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/render.ts @@ -45,7 +45,14 @@ export function getRender({ const renderServerComponentData = isServerComponent ? query.__flight__ !== undefined : false + + const serverComponentProps = + isServerComponent && query.__props__ + ? JSON.parse(query.__props__) + : undefined + delete query.__flight__ + delete query.__props__ const req = { url: pathname, @@ -73,6 +80,7 @@ export function getRender({ supportsDynamicHTML: true, concurrentFeatures: true, renderServerComponentData, + serverComponentProps, serverComponentManifest: isServerComponent ? rscManifest : null, ComponentMod: null, } diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx index 625a5b16912e025..e7ab94e6b57a3eb 100644 --- a/packages/next/client/index.tsx +++ b/packages/next/client/index.tsx @@ -653,10 +653,13 @@ if (process.env.__NEXT_RSC) { const rscCache = createResponseCache() - function fetchFlight(href: string) { + function fetchFlight(href: string, props?: any) { const url = new URL(href, location.origin) const searchParams = url.searchParams searchParams.append('__flight__', '1') + if (props) { + searchParams.append('__props__', JSON.stringify(props)) + } return fetch(url.toString()) } @@ -700,10 +703,10 @@ if (process.env.__NEXT_RSC) { const startTransition = React.startTransition const renrender = () => dispatch({}) // If there is no cache, or there is serialized data already - function refreshCache() { + function refreshCache(nextProps: any) { startTransition(() => { const href = getHref() - const response = createFromFetch(fetchFlight(href)) + const response = createFromFetch(fetchFlight(href, nextProps)) // FIXME: router.asPath can be different from current location due to navigation rscCache.set(href, response) renrender() diff --git a/packages/next/client/rsc.ts b/packages/next/client/rsc.ts index c1158f5fbf9719b..262590160641001 100644 --- a/packages/next/client/rsc.ts +++ b/packages/next/client/rsc.ts @@ -1,6 +1,6 @@ import { createContext, useContext } from 'react' -export const RefreshContext = createContext(() => {}) +export const RefreshContext = createContext((_: any) => {}) export function unstable_useRefreshRoot() { // eslint-disable-next-line react-hooks/rules-of-hooks diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index 927e237a72a3a3b..56ae6780be9e312 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -209,6 +209,7 @@ export type RenderOptsPartial = { resolvedAsPath?: string serverComponentManifest?: any renderServerComponentData?: boolean + serverComponentProps?: any distDir?: string locale?: string locales?: string[] @@ -356,6 +357,7 @@ export async function renderToHTML( getServerSideProps, serverComponentManifest, renderServerComponentData, + serverComponentProps, isDataReq, params, previewProps, @@ -1004,7 +1006,7 @@ export async function renderToHTML( if (renderServerComponentData) { const stream: ReadableStream = renderToReadableStream( - , + , serverComponentManifest ) const reader = stream.getReader()