@@ -28,6 +28,8 @@ import { getLogger, getRequestContext } from './request-context.cjs'
28
28
import { isAnyTagStale , markTagsAsStaleAndPurgeEdgeCache , purgeEdgeCache } from './tags-handler.cjs'
29
29
import { getTracer , recordWarning } from './tracer.cjs'
30
30
31
+ let memoizedPrerenderManifest : PrerenderManifest
32
+
31
33
export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
32
34
options : CacheHandlerContext
33
35
revalidatedTags : string [ ]
@@ -165,6 +167,26 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
165
167
}
166
168
}
167
169
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
+
168
190
private async injectEntryToPrerenderManifest (
169
191
key : string ,
170
192
{ revalidate, cacheControl } : Pick < NetlifyCachedPageValue , 'revalidate' | 'cacheControl' > ,
@@ -176,11 +198,7 @@ export class NetlifyCacheHandler implements CacheHandlerForMultipleVersions {
176
198
typeof cacheControl !== 'undefined' )
177
199
) {
178
200
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 )
184
202
if ( typeof cacheControl !== 'undefined' ) {
185
203
// instead of `revalidate` property, we might get `cacheControls` ( https://github.com/vercel/next.js/pull/76207 )
186
204
// then we need to keep track of revalidate values via SharedCacheControls
0 commit comments