From 863c16aa183243920caa5598add1879d9028f8d8 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 12 Aug 2022 16:30:08 +0200 Subject: [PATCH 1/2] Refactor handling of addPageEntry promise --- .../server/dev/on-demand-entry-handler.ts | 63 ++++++++----------- 1 file changed, 26 insertions(+), 37 deletions(-) diff --git a/packages/next/server/dev/on-demand-entry-handler.ts b/packages/next/server/dev/on-demand-entry-handler.ts index 950f6b28f7ffc6f..3c9ac87c8d8778e 100644 --- a/packages/next/server/dev/on-demand-entry-handler.ts +++ b/packages/next/server/dev/on-demand-entry-handler.ts @@ -404,33 +404,17 @@ export function onDemandEntryHandler({ const addPageEntry = ( compilerType: CompilerNameValues ): Promise => { - let resolve: (value: void | PromiseLike) => void - let reject: (reason?: any) => void - const promise = new Promise((res, rej) => { - resolve = res - reject = rej - }) - - const pageKey = `${compilerType}${pagePathData.page}` - - if (entries[pageKey]) { - added.set(compilerType, promise) - - entries[pageKey].dispose = false - entries[pageKey].lastActiveTime = Date.now() - if (entries[pageKey].status === BUILT) { - resolve!() - return promise - } - } else { - if ( - compilerType === COMPILER_NAMES.client && - (isServerComponent || isInsideAppDir) - ) { - // Skip adding the client entry here. + return new Promise((resolve, reject) => { + const pageKey = `${compilerType}${pagePathData.page}` + + if (entries[pageKey]) { + entries[pageKey].dispose = false + entries[pageKey].lastActiveTime = Date.now() + if (entries[pageKey].status === BUILT) { + resolve!() + return + } } else { - added.set(compilerType, promise) - entryAdded = true entries[pageKey] = { type: EntryTypes.ENTRY, @@ -442,16 +426,14 @@ export function onDemandEntryHandler({ status: ADDED, } } - } - doneCallbacks!.once(pageKey, (err: Error) => { - if (err) { - return reject(err) - } - resolve() + doneCallbacks!.once(pageKey, (err: Error) => { + if (err) { + return reject(err) + } + resolve() + }) }) - - return promise } const staticInfo = await getPageStaticInfo({ @@ -463,13 +445,20 @@ export function onDemandEntryHandler({ page: pagePathData.page, pageRuntime: staticInfo.runtime, onClient: () => { - addPageEntry(COMPILER_NAMES.client) + // Skip adding the client entry for app / Server Components. + if (isServerComponent || isInsideAppDir) { + return + } + added.set(COMPILER_NAMES.client, addPageEntry(COMPILER_NAMES.client)) }, onServer: () => { - addPageEntry(COMPILER_NAMES.server) + added.set(COMPILER_NAMES.server, addPageEntry(COMPILER_NAMES.server)) }, onEdgeServer: () => { - addPageEntry(COMPILER_NAMES.edgeServer) + added.set( + COMPILER_NAMES.edgeServer, + addPageEntry(COMPILER_NAMES.edgeServer) + ) }, }) From 8274c9c9e9df1d1512f5f59c10f019bce5a1ac63 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 12 Aug 2022 16:58:18 +0200 Subject: [PATCH 2/2] Split invalidate from addEntry --- .../server/dev/on-demand-entry-handler.ts | 101 ++++++++++++------ 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/packages/next/server/dev/on-demand-entry-handler.ts b/packages/next/server/dev/on-demand-entry-handler.ts index 3c9ac87c8d8778e..d9055ab2e948abd 100644 --- a/packages/next/server/dev/on-demand-entry-handler.ts +++ b/packages/next/server/dev/on-demand-entry-handler.ts @@ -392,9 +392,6 @@ export function onDemandEntryHandler({ appDir ) - let entryAdded = false - const added = new Map>() - const isServerComponent = serverComponentRegex.test( pagePathData.absolutePagePath ) @@ -403,37 +400,46 @@ export function onDemandEntryHandler({ const addPageEntry = ( compilerType: CompilerNameValues - ): Promise => { - return new Promise((resolve, reject) => { - const pageKey = `${compilerType}${pagePathData.page}` - - if (entries[pageKey]) { - entries[pageKey].dispose = false - entries[pageKey].lastActiveTime = Date.now() - if (entries[pageKey].status === BUILT) { - resolve!() - return - } - } else { - entryAdded = true - entries[pageKey] = { - type: EntryTypes.ENTRY, - absolutePagePath: pagePathData.absolutePagePath, - request: pagePathData.absolutePagePath, - bundlePath: pagePathData.bundlePath, - dispose: false, - lastActiveTime: Date.now(), - status: ADDED, + ): { + pageKey: string + newEntry: boolean + shouldInvalidate: boolean + } => { + const pageKey = `${compilerType}${pagePathData.page}` + + if (entries[pageKey]) { + entries[pageKey].dispose = false + entries[pageKey].lastActiveTime = Date.now() + if (entries[pageKey].status === BUILT) { + return { + pageKey, + newEntry: false, + shouldInvalidate: false, } } - doneCallbacks!.once(pageKey, (err: Error) => { - if (err) { - return reject(err) - } - resolve() - }) - }) + return { + pageKey, + newEntry: false, + shouldInvalidate: true, + } + } + + entries[pageKey] = { + type: EntryTypes.ENTRY, + absolutePagePath: pagePathData.absolutePagePath, + request: pagePathData.absolutePagePath, + bundlePath: pagePathData.bundlePath, + dispose: false, + lastActiveTime: Date.now(), + status: ADDED, + } + + return { + pageKey, + newEntry: true, + shouldInvalidate: true, + } } const staticInfo = await getPageStaticInfo({ @@ -441,6 +447,11 @@ export function onDemandEntryHandler({ nextConfig, }) + const added = new Map< + CompilerNameValues, + ReturnType + >() + await runDependingOnPageType({ page: pagePathData.page, pageRuntime: staticInfo.runtime, @@ -462,16 +473,36 @@ export function onDemandEntryHandler({ }, }) - if (entryAdded) { + const addedValues = [...added.values()] + const entriesThatShouldBeInvalidated = addedValues.filter( + (entry) => entry.shouldInvalidate + ) + const hasNewEntry = addedValues.some((entry) => entry.newEntry) + + if (hasNewEntry) { reportTrigger( - !clientOnly && added.size > 1 + !clientOnly && hasNewEntry ? `${pagePathData.page} (client and server)` : pagePathData.page ) - invalidator.invalidate([...added.keys()]) } - await Promise.all(added.values()) + if (entriesThatShouldBeInvalidated.length > 0) { + const invalidatePromises = entriesThatShouldBeInvalidated.map( + ({ pageKey }) => { + return new Promise((resolve, reject) => { + doneCallbacks!.once(pageKey, (err: Error) => { + if (err) { + return reject(err) + } + resolve() + }) + }) + } + ) + invalidator.invalidate([...added.keys()]) + await Promise.all(invalidatePromises) + } }, onHMR(client: ws) {