Skip to content

Commit

Permalink
fix react-server-dom-webpack cache invalidation
Browse files Browse the repository at this point in the history
  • Loading branch information
ForsakenHarmony committed Sep 13, 2023
1 parent 083f49c commit cbe9df9
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 25 deletions.
7 changes: 4 additions & 3 deletions packages/next/src/server/app-render/use-flight-response.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ export function useFlightResponse(
return flightResponseRef.current
}
// react-server-dom-webpack/client.edge must not be hoisted for require cache clearing to work correctly
const {
createFromReadableStream,
} = require(`react-server-dom-webpack/client.edge`)
const { createFromReadableStream } = process.env.NEXT_MINIMAL
? // @ts-ignore
__non_webpack_require__(`react-server-dom-webpack/client.edge`)
: require(`react-server-dom-webpack/client.edge`)

const [renderStream, forwardStream] = req.tee()
const res = createFromReadableStream(renderStream, {
Expand Down
79 changes: 57 additions & 22 deletions packages/next/src/server/lib/router-utils/setup-dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,10 @@ import {
TurboPackConnectedAction,
} from '../../dev/hot-reloader-types'
import { debounce } from '../../utils'
import { deleteCache } from '../../../build/webpack/plugins/nextjs-require-cache-hot-reloader'
import {
deleteAppClientCache,
deleteCache,
} from '../../../build/webpack/plugins/nextjs-require-cache-hot-reloader'
import { normalizeMetadataRoute } from '../../../lib/metadata/get-metadata-route'

const wsServer = new ws.Server({ noServer: true })
Expand Down Expand Up @@ -311,20 +314,18 @@ async function startWatcher(opts: SetupOpts) {
async function processResult(
result: TurbopackResult<WrittenEndpoint>
): Promise<TurbopackResult<WrittenEndpoint>> {
for (const file of result.serverPaths
.map((p) => path.join(distDir, p))
.concat([
// We need to clear the chunk cache in react
require.resolve(
'next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js'
),
// And this redirecting module as well
require.resolve(
'next/dist/compiled/react-server-dom-webpack/client.edge.js'
),
])) {
const hasAppPaths = result.serverPaths.some((path) =>
path.startsWith('server/app')
)

if (hasAppPaths) {
deleteAppClientCache()
}

for (const file of result.serverPaths.map((p) => path.join(distDir, p))) {
deleteCache(file)
}

return result
}

Expand All @@ -337,6 +338,7 @@ async function startWatcher(opts: SetupOpts) {
moduleTrace?: Array<{ moduleName: string }>
stack?: string
}

const errors = new Map<string, HmrError>()
for (const [, issueMap] of issues) {
for (const [key, issue] of issueMap) {
Expand Down Expand Up @@ -380,8 +382,6 @@ async function startWatcher(opts: SetupOpts) {
sendHmrDebounce()
}

const clearCache = (filePath: string) => deleteCache(filePath)

async function loadPartialManifest<T>(
name: string,
pageName: string,
Expand All @@ -407,6 +407,7 @@ async function startWatcher(opts: SetupOpts) {
}

const buildManifests = new Map<string, BuildManifest>()
const fallbackBuildManifests = new Map<string, BuildManifest>()
const appBuildManifests = new Map<string, AppBuildManifest>()
const pagesManifests = new Map<string, PagesManifest>()
const appPathsManifests = new Map<string, PagesManifest>()
Expand Down Expand Up @@ -437,6 +438,16 @@ async function startWatcher(opts: SetupOpts) {
)
}

async function loadFallbackBuildManifest(
pageName: string,
type: 'app' | 'pages' = 'pages'
): Promise<void> {
fallbackBuildManifests.set(
pageName,
await loadPartialManifest(BUILD_MANIFEST, pageName, type)
)
}

async function loadAppBuildManifest(pageName: string): Promise<void> {
appBuildManifests.set(
pageName,
Expand Down Expand Up @@ -482,6 +493,7 @@ async function startWatcher(opts: SetupOpts) {
if (payload) sendHmr('endpoint-change', page, payload)
}
}

function clearChangeSubscription(page: string) {
const subscription = changeSubscriptions.get(page)
if (subscription) {
Expand Down Expand Up @@ -583,6 +595,7 @@ async function startWatcher(opts: SetupOpts) {
currentEntriesHandlingResolve = undefined
}
}

handleEntries().catch((err) => {
console.error(err)
process.exit(1)
Expand Down Expand Up @@ -665,7 +678,7 @@ async function startWatcher(opts: SetupOpts) {
async function writeBuildManifest(): Promise<void> {
const buildManifest = mergeBuildManifests(buildManifests.values())
const buildManifestPath = path.join(distDir, BUILD_MANIFEST)
await clearCache(buildManifestPath)
deleteCache(buildManifestPath)
await writeFile(
buildManifestPath,
JSON.stringify(buildManifest, null, 2),
Expand Down Expand Up @@ -696,12 +709,28 @@ async function startWatcher(opts: SetupOpts) {
)
}

async function writeFallbackBuildManifest(): Promise<void> {
const fallbackBuildManifest = mergeBuildManifests(
fallbackBuildManifests.values()
)
const fallbackBuildManifestPath = path.join(
distDir,
`fallback-${BUILD_MANIFEST}`
)
deleteCache(fallbackBuildManifestPath)
await writeFile(
fallbackBuildManifestPath,
JSON.stringify(fallbackBuildManifest, null, 2),
'utf-8'
)
}

async function writeAppBuildManifest(): Promise<void> {
const appBuildManifest = mergeAppBuildManifests(
appBuildManifests.values()
)
const appBuildManifestPath = path.join(distDir, APP_BUILD_MANIFEST)
await clearCache(appBuildManifestPath)
deleteCache(appBuildManifestPath)
await writeFile(
appBuildManifestPath,
JSON.stringify(appBuildManifest, null, 2),
Expand All @@ -712,7 +741,7 @@ async function startWatcher(opts: SetupOpts) {
async function writePagesManifest(): Promise<void> {
const pagesManifest = mergePagesManifests(pagesManifests.values())
const pagesManifestPath = path.join(distDir, 'server', PAGES_MANIFEST)
await clearCache(pagesManifestPath)
deleteCache(pagesManifestPath)
await writeFile(
pagesManifestPath,
JSON.stringify(pagesManifest, null, 2),
Expand All @@ -727,7 +756,7 @@ async function startWatcher(opts: SetupOpts) {
'server',
APP_PATHS_MANIFEST
)
await clearCache(appPathsManifestPath)
deleteCache(appPathsManifestPath)
await writeFile(
appPathsManifestPath,
JSON.stringify(appPathsManifest, null, 2),
Expand All @@ -743,7 +772,7 @@ async function startWatcher(opts: SetupOpts) {
distDir,
'server/middleware-manifest.json'
)
await clearCache(middlewareManifestPath)
deleteCache(middlewareManifestPath)
await writeFile(
middlewareManifestPath,
JSON.stringify(middlewareManifest, null, 2),
Expand All @@ -759,7 +788,7 @@ async function startWatcher(opts: SetupOpts) {
'server',
NEXT_FONT_MANIFEST + '.json'
)
await clearCache(fontManifestPath)
deleteCache(fontManifestPath)
await writeFile(
fontManifestPath,
JSON.stringify(
Expand All @@ -780,7 +809,7 @@ async function startWatcher(opts: SetupOpts) {
distDir,
'react-loadable-manifest.json'
)
await clearCache(loadableManifestPath)
deleteCache(loadableManifestPath)
await writeFile(
loadableManifestPath,
JSON.stringify({}, null, 2),
Expand Down Expand Up @@ -847,6 +876,7 @@ async function startWatcher(opts: SetupOpts) {
await currentEntriesHandling
await writeBuildManifest()
await writeAppBuildManifest()
await writeFallbackBuildManifest()
await writePagesManifest()
await writeAppPathsManifest()
await writeMiddlewareManifest()
Expand Down Expand Up @@ -985,6 +1015,7 @@ async function startWatcher(opts: SetupOpts) {
processIssues('_app', writtenEndpoint)
}
await loadBuildManifest('_app')
await loadFallbackBuildManifest('_app')
await loadPagesManifest('_app')

if (globalEntries.document) {
Expand All @@ -1005,9 +1036,11 @@ async function startWatcher(opts: SetupOpts) {
processIssues(page, writtenEndpoint)
}
await loadBuildManifest('_error')
await loadFallbackBuildManifest('_error')
await loadPagesManifest('_error')

await writeBuildManifest()
await writeFallbackBuildManifest()
await writePagesManifest()
await writeMiddlewareManifest()
await writeOtherManifests()
Expand Down Expand Up @@ -1077,6 +1110,7 @@ async function startWatcher(opts: SetupOpts) {
processIssues('_app', writtenEndpoint)
}
await loadBuildManifest('_app')
await loadFallbackBuildManifest('_app')
await loadPagesManifest('_app')

if (globalEntries.document) {
Expand Down Expand Up @@ -1118,6 +1152,7 @@ async function startWatcher(opts: SetupOpts) {
}

await writeBuildManifest()
await writeFallbackBuildManifest()
await writePagesManifest()
await writeMiddlewareManifest()
await writeOtherManifests()
Expand Down

0 comments on commit cbe9df9

Please sign in to comment.