Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 23 additions & 5 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /