Skip to content

Commit 0494f72

Browse files
committed
chore: add memoization for prerender manifest
1 parent ef30a47 commit 0494f72

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/run/handlers/cache.cts

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)