Skip to content

Commit a9119d3

Browse files
authored
fix: add a fallback for loadManifest import path (#2881)
* fix: add a fallback for loadManifest import path * chore: lint and typecheck fixes * chore: add memoization for prerender manifest * fix: move prerenderManifest memoization to module scope
1 parent ef70de6 commit a9119d3

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

src/run/handlers/cache.cts

+23-5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import { getLogger, getRequestContext } from './request-context.cjs'
2828
import { isAnyTagStale, markTagsAsStaleAndPurgeEdgeCache, purgeEdgeCache } from './tags-handler.cjs'
2929
import { getTracer, recordWarning } from './tracer.cjs'
3030

31+
let memoizedPrerenderManifest: PrerenderManifest
32+
3133
export 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

Comments
 (0)