From 209ae4ac6278c5aef0b28f2b9bcf129ada1e1ac2 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 6 Mar 2024 12:50:59 +0000 Subject: [PATCH] fix(nuxt): cache-bust payloads with build id (#26068) --- packages/nuxt/src/app/composables/payload.ts | 7 ++++--- packages/nuxt/src/core/runtime/nitro/renderer.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index a4eeb66582..97edda896d 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -3,6 +3,7 @@ import { parse } from 'devalue' import { useHead } from '@unhead/vue' import { getCurrentInstance } from 'vue' import { useNuxtApp, useRuntimeConfig } from '../nuxt' +import { useAppConfig } from '../config' import { useRoute } from './router' import { getAppManifest, getRouteRules } from './manifest' @@ -50,14 +51,14 @@ export function preloadPayload (url: string, opts: LoadPayloadOptions = {}) { // --- Internal --- -const extension = renderJsonPayloads ? 'json' : 'js' +const filename = renderJsonPayloads ? '_payload.json' : '_payload.js' function _getPayloadURL (url: string, opts: LoadPayloadOptions = {}) { const u = new URL(url, 'http://localhost') if (u.host !== 'localhost' || hasProtocol(u.pathname, { acceptRelative: true })) { throw new Error('Payload URL must not include hostname: ' + url) } - const hash = opts.hash || (opts.fresh ? Date.now() : '') - return joinURL(useRuntimeConfig().app.baseURL, u.pathname, hash ? `_payload.${hash}.${extension}` : `_payload.${extension}`) + const hash = opts.hash || (opts.fresh ? Date.now() : (useAppConfig().nuxt as any)?.buildId) + return joinURL(useRuntimeConfig().app.baseURL, u.pathname, filename + (hash ? `?${hash}` : '')) } async function _importPayload (payloadURL: string) { diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 344589e516..db3fc8fa2a 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -225,7 +225,7 @@ async function getIslandContext (event: H3Event): Promise { return ctx } -const PAYLOAD_URL_RE = process.env.NUXT_JSON_PAYLOADS ? /\/_payload(\.[a-zA-Z0-9]+)?.json(\?.*)?$/ : /\/_payload(\.[a-zA-Z0-9]+)?.js(\?.*)?$/ +const PAYLOAD_URL_RE = process.env.NUXT_JSON_PAYLOADS ? /\/_payload.json(\?.*)?$/ : /\/_payload.js(\?.*)?$/ const ROOT_NODE_REGEX = new RegExp(`^<${appRootTag}${appRootId ? ` id="${appRootId}"` : ''}>([\\s\\S]*)$`) const PRERENDER_NO_SSR_ROUTES = new Set(['/index.html', '/200.html', '/404.html'])