@@ -32,6 +32,7 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
3232 options : CacheHandlerContext
3333 revalidatedTags : string [ ]
3434 cacheStore : MemoizedKeyValueStoreBackedByRegionalBlobStore
35+ prerenderManifest ?: Promise < PrerenderManifest >
3536 tracer = getTracer ( )
3637
3738 constructor ( options : CacheHandlerContext ) {
@@ -165,6 +166,30 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
165166 }
166167 }
167168
169+ private async getPrerenderManifest ( serverDistDir : string ) : Promise < PrerenderManifest > {
170+ if ( this . prerenderManifest ) {
171+ return this . prerenderManifest
172+ }
173+
174+ const prerenderManifestPath = join ( serverDistDir , '..' , 'prerender-manifest.json' )
175+
176+ try {
177+ // @ts -expect-error Starting in 15.4.0-canary.10 loadManifest was relocated (https://github.com/vercel/next.js/pull/78358)
178+ // eslint-disable-next-line import/no-unresolved, n/no-missing-import
179+ const { loadManifest } = await import ( 'next/dist/server/load-manifest.external.js' )
180+ this . prerenderManifest = Promise . resolve (
181+ loadManifest ( prerenderManifestPath ) as PrerenderManifest ,
182+ )
183+ } catch {
184+ const { loadManifest } = await import ( 'next/dist/server/load-manifest.js' )
185+ this . prerenderManifest = Promise . resolve (
186+ loadManifest ( prerenderManifestPath ) as PrerenderManifest ,
187+ )
188+ }
189+
190+ return this . prerenderManifest
191+ }
192+
168193 private async injectEntryToPrerenderManifest (
169194 key : string ,
170195 { revalidate, cacheControl } : Pick < NetlifyCachedPageValue , 'revalidate' | 'cacheControl' > ,
@@ -176,19 +201,7 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
176201 typeof cacheControl !== 'undefined' )
177202 ) {
178203 try {
179- let loadManifest
180- try {
181- // @ts -expect-error Starting in 15.4.0-canary.10 loadManifest was relocated (https://github.com/vercel/next.js/pull/78358)
182- // eslint-disable-next-line @typescript-eslint/no-extra-semi, n/no-missing-import, import/no-unresolved
183- ; ( { loadManifest } = await import ( 'next/dist/server/load-manifest.external.js' ) )
184- } catch {
185- // eslint-disable-next-line @typescript-eslint/no-extra-semi
186- ; ( { loadManifest } = await import ( 'next/dist/server/load-manifest.js' ) )
187- }
188- const prerenderManifest = loadManifest (
189- join ( this . options . serverDistDir , '..' , 'prerender-manifest.json' ) ,
190- ) as PrerenderManifest
191-
204+ const prerenderManifest = await this . getPrerenderManifest ( this . options . serverDistDir )
192205 if ( typeof cacheControl !== 'undefined' ) {
193206 // instead of `revalidate` property, we might get `cacheControls` ( https://github.com/vercel/next.js/pull/76207 )
194207 // then we need to keep track of revalidate values via SharedCacheControls
0 commit comments