@@ -28,6 +28,8 @@ import { getLogger, getRequestContext } from './request-context.cjs'
2828import { isAnyTagStale , markTagsAsStaleAndPurgeEdgeCache , purgeEdgeCache } from './tags-handler.cjs'
2929import { getTracer , recordWarning } from './tracer.cjs'
3030
31+ let memoizedPrerenderManifest : PrerenderManifest
32+
3133export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
3234 options : CacheHandlerContext
3335 revalidatedTags : string [ ]
@@ -165,6 +167,26 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
165167 }
166168 }
167169
170+ private async getPrerenderManifest ( serverDistDir : string ) : Promise < PrerenderManifest > {
171+ if ( memoizedPrerenderManifest ) {
172+ return memoizedPrerenderManifest
173+ }
174+
175+ const prerenderManifestPath = join ( serverDistDir , '..' , 'prerender-manifest.json' )
176+
177+ try {
178+ // @ts -expect-error Starting in 15.4.0-canary.10 loadManifest was relocated (https://github.com/vercel/next.js/pull/78358)
179+ // eslint-disable-next-line import/no-unresolved, n/no-missing-import
180+ const { loadManifest } = await import ( 'next/dist/server/load-manifest.external.js' )
181+ memoizedPrerenderManifest = loadManifest ( prerenderManifestPath ) as PrerenderManifest
182+ } catch {
183+ const { loadManifest } = await import ( 'next/dist/server/load-manifest.js' )
184+ memoizedPrerenderManifest = loadManifest ( prerenderManifestPath ) as PrerenderManifest
185+ }
186+
187+ return memoizedPrerenderManifest
188+ }
189+
168190 private async injectEntryToPrerenderManifest (
169191 key : string ,
170192 { revalidate, cacheControl } : Pick < NetlifyCachedPageValue , 'revalidate' | 'cacheControl' > ,
@@ -176,11 +198,7 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
176198 typeof cacheControl !== 'undefined' )
177199 ) {
178200 try {
179- const { loadManifest } = await import ( 'next/dist/server/load-manifest.js' )
180- const prerenderManifest = loadManifest (
181- join ( this . options . serverDistDir , '..' , 'prerender-manifest.json' ) ,
182- ) as PrerenderManifest
183-
201+ const prerenderManifest = await this . getPrerenderManifest ( this . options . serverDistDir )
184202 if ( typeof cacheControl !== 'undefined' ) {
185203 // instead of `revalidate` property, we might get `cacheControls` ( https://github.com/vercel/next.js/pull/76207 )
186204 // then we need to keep track of revalidate values via SharedCacheControls
0 commit comments