From 9bf9e426922299f57d9f80f76230c1d720c27d4d Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 10:40:27 +0200 Subject: [PATCH 01/46] feat(nuxt): add payload js endpoint --- .../nuxt/src/core/runtime/nitro/renderer.ts | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index ab9d58042d5..cddc82ef659 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -101,10 +101,20 @@ const getSPARenderer = lazyCachedFunction(async () => { return { renderToString } }) +const PAYLOAD_FILE_NAME = '/_payload.js' + export default defineRenderHandler(async (event) => { // Whether we're rendering an error page const ssrError = event.req.url?.startsWith('/__nuxt_error') ? getQuery(event) as Exclude : null - const url = ssrError?.url as string || event.req.url! + let url = ssrError?.url as string || event.req.url! + + // Whether we are rendering payload response + let payloadReq = false + if (url.endsWith(PAYLOAD_FILE_NAME)) { + url = url.substring(0, url.length - PAYLOAD_FILE_NAME.length) || '/' + event.req.url = url + payloadReq = true + } // Initialize ssr context const ssrContext: NuxtSSRContext = { @@ -133,6 +143,20 @@ export default defineRenderHandler(async (event) => { throw ssrContext.payload.error } + // Payload render + if (payloadReq) { + const response: RenderResponse = { + body: `__NUXT_JSONP__("${url}", ${devalue(ssrContext.payload)})`, + statusCode: event.res.statusCode, + statusMessage: event.res.statusMessage, + headers: { + 'Content-Type': 'text/javascript;charset=UTF-8', + 'X-Powered-By': 'Nuxt' + } + } + return response + } + // Render meta const renderedMeta = await ssrContext.renderMeta?.() ?? {} From 9202c5515df29fe73476b48f827a939e5ac63db5 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 15:39:23 +0200 Subject: [PATCH 02/46] feat: use esm module --- packages/nuxt/src/core/runtime/nitro/renderer.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index cddc82ef659..d5a29ce7d06 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -101,7 +101,7 @@ const getSPARenderer = lazyCachedFunction(async () => { return { renderToString } }) -const PAYLOAD_FILE_NAME = '/_payload.js' +const PAYLOAD_URL_RE = /\/_payload.js[^/]*$/ export default defineRenderHandler(async (event) => { // Whether we're rendering an error page @@ -110,8 +110,8 @@ export default defineRenderHandler(async (event) => { // Whether we are rendering payload response let payloadReq = false - if (url.endsWith(PAYLOAD_FILE_NAME)) { - url = url.substring(0, url.length - PAYLOAD_FILE_NAME.length) || '/' + if (PAYLOAD_URL_RE.test(url)) { + url = url.substring(0, url.lastIndexOf('/')) || '/' event.req.url = url payloadReq = true } @@ -146,7 +146,7 @@ export default defineRenderHandler(async (event) => { // Payload render if (payloadReq) { const response: RenderResponse = { - body: `__NUXT_JSONP__("${url}", ${devalue(ssrContext.payload)})`, + body: renderPayloadJS(ssrContext), statusCode: event.res.statusCode, statusMessage: event.res.statusMessage, headers: { @@ -237,3 +237,7 @@ function renderHTMLDocument (rendered: NuxtRenderContext) { ${joinTags(rendered.html.bodyPreprend)}${joinTags(rendered.html.body)}${joinTags(rendered.html.bodyAppend)} ` } + +function renderPayloadJS (ssrContext: NuxtSSRContext) { + return `export const payload=${devalue(ssrContext.payload)}` +} From 1acb6595a43ee1cdf4b1f1c44844189afda688ba Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 15:39:39 +0200 Subject: [PATCH 03/46] feat: `loadPayload` (wip) --- packages/nuxt/src/app/composables/index.ts | 1 + packages/nuxt/src/app/composables/payload.ts | 26 ++++++++++++++++++++ packages/nuxt/src/auto-imports/presets.ts | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 packages/nuxt/src/app/composables/payload.ts diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index 92bcf1b0d19..da3e66e390e 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -12,3 +12,4 @@ export type { CookieOptions, CookieRef } from './cookie' export { useRequestHeaders, useRequestEvent, setResponseStatus } from './ssr' export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, navigateTo, useRoute, useActiveRoute, useRouter } from './router' export type { AddRouteMiddlewareOptions, RouteMiddleware } from './router' +export { loadPayload } from './payload' diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts new file mode 100644 index 00000000000..644eb1a3ebf --- /dev/null +++ b/packages/nuxt/src/app/composables/payload.ts @@ -0,0 +1,26 @@ +import { parseURL } from 'ufo' +import { useNuxtApp } from '../nuxt' + +export function loadPayload (url: string, forceRefetch: boolean = false) { + const parsed = parseURL(url) + if (parsed.search) { + throw new Error('Payload URLs cannot contain search params') + } + + const nuxtApp = useNuxtApp() + const cache = nuxtApp._payloadCache = nuxtApp._payloadCache || {} + + const payloadURL = parsed.pathname + '/_payload.json' + + if (!forceRefetch && cache[payloadURL]) { + return cache[payloadURL] + } + + cache[url] = _importPayload(payloadURL + (forceRefetch ? '?_=' + Date.now() : '')) + return cache[url] +} + +async function _importPayload (payloadURL: string) { + const { payload } = await import(payloadURL /* @vite-ignore */) as { payload: any } + return payload +} diff --git a/packages/nuxt/src/auto-imports/presets.ts b/packages/nuxt/src/auto-imports/presets.ts index 81d94856c4f..51f8a0f3a99 100644 --- a/packages/nuxt/src/auto-imports/presets.ts +++ b/packages/nuxt/src/auto-imports/presets.ts @@ -49,7 +49,8 @@ export const appPreset = defineUnimportPreset({ 'isNuxtError', 'useError', 'createError', - 'defineNuxtLink' + 'defineNuxtLink', + 'loadPayload' ] }) From bd84ef3473be3d88e474084b5d3becc0c14b7480 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 16:17:27 +0200 Subject: [PATCH 04/46] add usePayload and prefetchPayload (woking) --- packages/nuxt/src/app/composables/index.ts | 2 +- packages/nuxt/src/app/composables/payload.ts | 45 ++++++++++++++------ packages/nuxt/src/auto-imports/presets.ts | 3 +- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index da3e66e390e..616a906e0c0 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -12,4 +12,4 @@ export type { CookieOptions, CookieRef } from './cookie' export { useRequestHeaders, useRequestEvent, setResponseStatus } from './ssr' export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, navigateTo, useRoute, useActiveRoute, useRouter } from './router' export type { AddRouteMiddlewareOptions, RouteMiddleware } from './router' -export { loadPayload } from './payload' +export { usePayload, prefetchPayload } from './payload' diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index 644eb1a3ebf..78e2cff18c1 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -1,26 +1,47 @@ -import { parseURL } from 'ufo' +import { parseURL, joinURL } from 'ufo' import { useNuxtApp } from '../nuxt' +import { useHead } from '#imports' -export function loadPayload (url: string, forceRefetch: boolean = false) { - const parsed = parseURL(url) - if (parsed.search) { - throw new Error('Payload URLs cannot contain search params') - } - +export function usePayload (url: string, forceRefetch: boolean = false) { + if (process.server) { return null } + const payloadURL = _getPayloadURL(url) const nuxtApp = useNuxtApp() const cache = nuxtApp._payloadCache = nuxtApp._payloadCache || {} - - const payloadURL = parsed.pathname + '/_payload.json' - if (!forceRefetch && cache[payloadURL]) { return cache[payloadURL] } - cache[url] = _importPayload(payloadURL + (forceRefetch ? '?_=' + Date.now() : '')) return cache[url] } +export function prefetchPayload (url: string) { + if (process.server) { + // TODO: Vite adds ?import in _importPayload ?! + const payloadURL = _getPayloadURL(url) + '?import' + useHead({ + link: [ + { rel: 'modulepreload', href: payloadURL } + ] + }) + } else if (process.client) { + usePayload(url).catch((error) => { + console.warn(`Error while prefetching payload for ${url} :`, error) + }) + } +} + +// --- Internal --- + +function _getPayloadURL (url: string) { + const parsed = parseURL(url) + if (parsed.search) { + throw new Error('Payload URL cannot contain search params: ' + url) + } + return joinURL(parsed.pathname, '_payload.js') +} + async function _importPayload (payloadURL: string) { - const { payload } = await import(payloadURL /* @vite-ignore */) as { payload: any } + if (process.server) { return null } + const { payload } = await import(/* @vite-ignore */ payloadURL) as { payload: any } return payload } diff --git a/packages/nuxt/src/auto-imports/presets.ts b/packages/nuxt/src/auto-imports/presets.ts index 51f8a0f3a99..b7d8f86c6e1 100644 --- a/packages/nuxt/src/auto-imports/presets.ts +++ b/packages/nuxt/src/auto-imports/presets.ts @@ -50,7 +50,8 @@ export const appPreset = defineUnimportPreset({ 'useError', 'createError', 'defineNuxtLink', - 'loadPayload' + 'usePayload', + 'prefetchPayload' ] }) From ba576e4697c148414fe52c0fc2942b6baa63fb18 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 16:23:33 +0200 Subject: [PATCH 05/46] refactor: use internal #app --- packages/nuxt/src/app/composables/payload.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index 78e2cff18c1..5ee2ac78e82 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -1,6 +1,6 @@ import { parseURL, joinURL } from 'ufo' import { useNuxtApp } from '../nuxt' -import { useHead } from '#imports' +import { useHead } from '#app' export function usePayload (url: string, forceRefetch: boolean = false) { if (process.server) { return null } From e7dd892ea7c807b0b0938405be983a5b79650e15 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 16:26:17 +0200 Subject: [PATCH 06/46] always use link to prefetch --- packages/nuxt/src/app/composables/payload.ts | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index 5ee2ac78e82..c8acd4bccd9 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -15,19 +15,13 @@ export function usePayload (url: string, forceRefetch: boolean = false) { } export function prefetchPayload (url: string) { - if (process.server) { - // TODO: Vite adds ?import in _importPayload ?! - const payloadURL = _getPayloadURL(url) + '?import' - useHead({ - link: [ - { rel: 'modulepreload', href: payloadURL } - ] - }) - } else if (process.client) { - usePayload(url).catch((error) => { - console.warn(`Error while prefetching payload for ${url} :`, error) - }) - } + // TODO: Vite adds ?import in _importPayload ?! + const payloadURL = _getPayloadURL(url) + '?import' + useHead({ + link: [ + { rel: 'modulepreload', href: payloadURL } + ] + }) } // --- Internal --- From ccc982fb59ec6d77ba9208c2da095754ce02da6e Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 17:10:47 +0200 Subject: [PATCH 07/46] use x-nitro-prerender to prerender payload --- packages/nuxt/package.json | 2 +- packages/nuxt/src/app/composables/payload.ts | 16 ++++++++++++---- yarn.lock | 10 +++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 8336d214dda..17976c49e0e 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -52,7 +52,7 @@ "knitwork": "^0.1.2", "magic-string": "^0.26.2", "mlly": "^0.5.7", - "nitropack": "^0.4.14", + "nitropack": "^0.4.15", "nuxi": "^3.0.0-rc.6", "ohash": "^0.1.5", "ohmyfetch": "^0.4.18", diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index c8acd4bccd9..1d671fe0663 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -1,6 +1,7 @@ import { parseURL, joinURL } from 'ufo' +import { appendHeader, getRequestHeader } from 'h3' import { useNuxtApp } from '../nuxt' -import { useHead } from '#app' +import { useHead, useRequestEvent } from '#app' export function usePayload (url: string, forceRefetch: boolean = false) { if (process.server) { return null } @@ -15,13 +16,20 @@ export function usePayload (url: string, forceRefetch: boolean = false) { } export function prefetchPayload (url: string) { - // TODO: Vite adds ?import in _importPayload ?! - const payloadURL = _getPayloadURL(url) + '?import' + const payloadURL = _getPayloadURL(url) useHead({ link: [ - { rel: 'modulepreload', href: payloadURL } + // TODO: Vite adds ?import in _importPayload ?! + { rel: 'modulepreload', href: payloadURL + '?import' } ] }) + if (process.server) { + const event = useRequestEvent() + const isPrerendering = getRequestHeader(event, 'x-nitro-prerender') + if (isPrerendering) { + appendHeader(event, 'x-nitro-prerender', payloadURL) + } + } } // --- Internal --- diff --git a/yarn.lock b/yarn.lock index fcc5384c115..4484ef7055b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9619,9 +9619,9 @@ __metadata: languageName: node linkType: hard -"nitropack@npm:^0.4.14": - version: 0.4.14 - resolution: "nitropack@npm:0.4.14" +"nitropack@npm:^0.4.15": + version: 0.4.15 + resolution: "nitropack@npm:0.4.15" dependencies: "@cloudflare/kv-asset-handler": ^0.2.0 "@netlify/functions": ^1.0.0 @@ -9684,7 +9684,7 @@ __metadata: bin: nitro: dist/cli.mjs nitropack: dist/cli.mjs - checksum: 86d4163a6d4dfa3919b7dd48156abbc3af9f6ad8d87aa296e490828d7bc90101546fdadd5ec2f79c31949ad2d1832ae99a39eb0094f9d7334d5c9daa9ede2925 + checksum: a5e99d03bb9246f12f48f4f99db7a9a7455881dd58d0661766e5b1d171074875fc0d4fb18ab808586a81996fe02b1997c397488daae7400847330c83c0f38c7d languageName: node linkType: hard @@ -10111,7 +10111,7 @@ __metadata: knitwork: ^0.1.2 magic-string: ^0.26.2 mlly: ^0.5.7 - nitropack: ^0.4.14 + nitropack: ^0.4.15 nuxi: ^3.0.0-rc.6 ohash: ^0.1.5 ohmyfetch: ^0.4.18 From 112694caef60f4703cc02efcdd70b1a988de276a Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 17:25:34 +0200 Subject: [PATCH 08/46] feat: isPrerendering composable --- packages/nuxt/src/app/composables/index.ts | 1 + packages/nuxt/src/app/composables/payload.ts | 10 ++++------ packages/nuxt/src/app/composables/utils.ts | 10 ++++++++++ packages/nuxt/src/auto-imports/presets.ts | 3 ++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index 616a906e0c0..3f987af2663 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -13,3 +13,4 @@ export { useRequestHeaders, useRequestEvent, setResponseStatus } from './ssr' export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, navigateTo, useRoute, useActiveRoute, useRouter } from './router' export type { AddRouteMiddlewareOptions, RouteMiddleware } from './router' export { usePayload, prefetchPayload } from './payload' +export { isPrerendering } from './utils' diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index 1d671fe0663..53af12b6556 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -1,6 +1,7 @@ import { parseURL, joinURL } from 'ufo' -import { appendHeader, getRequestHeader } from 'h3' +import { appendHeader } from 'h3' import { useNuxtApp } from '../nuxt' +import { isPrerendering } from './utils' import { useHead, useRequestEvent } from '#app' export function usePayload (url: string, forceRefetch: boolean = false) { @@ -23,12 +24,9 @@ export function prefetchPayload (url: string) { { rel: 'modulepreload', href: payloadURL + '?import' } ] }) - if (process.server) { + if (process.server && isPrerendering()) { const event = useRequestEvent() - const isPrerendering = getRequestHeader(event, 'x-nitro-prerender') - if (isPrerendering) { - appendHeader(event, 'x-nitro-prerender', payloadURL) - } + appendHeader(event, 'x-nitro-prerender', payloadURL) } } diff --git a/packages/nuxt/src/app/composables/utils.ts b/packages/nuxt/src/app/composables/utils.ts index 1f454328cb2..97fc26f4917 100644 --- a/packages/nuxt/src/app/composables/utils.ts +++ b/packages/nuxt/src/app/composables/utils.ts @@ -1,3 +1,13 @@ import { isRef, ref, Ref } from 'vue' +import { getRequestHeader } from 'h3' +import { useRequestEvent } from './ssr' export const wrapInRef = (value: T | Ref) => isRef(value) ? value : ref(value) + +export function isPrerendering () { + if (process.client) { + return false // TODO + } + const event = useRequestEvent() + return !!getRequestHeader(event, 'x-nitro-prerender') +} diff --git a/packages/nuxt/src/auto-imports/presets.ts b/packages/nuxt/src/auto-imports/presets.ts index b7d8f86c6e1..678fa351d11 100644 --- a/packages/nuxt/src/auto-imports/presets.ts +++ b/packages/nuxt/src/auto-imports/presets.ts @@ -51,7 +51,8 @@ export const appPreset = defineUnimportPreset({ 'createError', 'defineNuxtLink', 'usePayload', - 'prefetchPayload' + 'prefetchPayload', + 'isPrerendering' ] }) From 39cbe739d8e99bd1a8f78320a7b4a4a60c49cb32 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 17:39:33 +0200 Subject: [PATCH 09/46] universal isPrerender and prerenderedAt to payload --- packages/nuxt/src/app/composables/index.ts | 2 +- packages/nuxt/src/app/composables/payload.ts | 4 ++-- packages/nuxt/src/app/composables/utils.ts | 13 +++++-------- packages/nuxt/src/app/nuxt.ts | 10 +++++++++- packages/nuxt/src/auto-imports/presets.ts | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index 3f987af2663..d964ffb2943 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -13,4 +13,4 @@ export { useRequestHeaders, useRequestEvent, setResponseStatus } from './ssr' export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, navigateTo, useRoute, useActiveRoute, useRouter } from './router' export type { AddRouteMiddlewareOptions, RouteMiddleware } from './router' export { usePayload, prefetchPayload } from './payload' -export { isPrerendering } from './utils' +export { isPrerender } from './utils' diff --git a/packages/nuxt/src/app/composables/payload.ts b/packages/nuxt/src/app/composables/payload.ts index 53af12b6556..a0d6ebb2f35 100644 --- a/packages/nuxt/src/app/composables/payload.ts +++ b/packages/nuxt/src/app/composables/payload.ts @@ -1,7 +1,7 @@ import { parseURL, joinURL } from 'ufo' import { appendHeader } from 'h3' import { useNuxtApp } from '../nuxt' -import { isPrerendering } from './utils' +import { isPrerender } from './utils' import { useHead, useRequestEvent } from '#app' export function usePayload (url: string, forceRefetch: boolean = false) { @@ -24,7 +24,7 @@ export function prefetchPayload (url: string) { { rel: 'modulepreload', href: payloadURL + '?import' } ] }) - if (process.server && isPrerendering()) { + if (process.server && !process.dev && isPrerender()) { const event = useRequestEvent() appendHeader(event, 'x-nitro-prerender', payloadURL) } diff --git a/packages/nuxt/src/app/composables/utils.ts b/packages/nuxt/src/app/composables/utils.ts index 97fc26f4917..0a8af09a000 100644 --- a/packages/nuxt/src/app/composables/utils.ts +++ b/packages/nuxt/src/app/composables/utils.ts @@ -1,13 +1,10 @@ import { isRef, ref, Ref } from 'vue' -import { getRequestHeader } from 'h3' -import { useRequestEvent } from './ssr' +import { useNuxtApp } from '#app' export const wrapInRef = (value: T | Ref) => isRef(value) ? value : ref(value) -export function isPrerendering () { - if (process.client) { - return false // TODO - } - const event = useRequestEvent() - return !!getRequestHeader(event, 'x-nitro-prerender') +export function isPrerender () { + // Note: Alternative for server is checking x-nitro-prerender header + const nuxtApp = useNuxtApp() + return !!nuxtApp.payload.prerenderedAt } diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index 2f5bc1ec72a..06f31d49b81 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -68,6 +68,7 @@ interface _NuxtApp { } payload: { serverRendered?: boolean + prerenderedAt?: number data?: Record state?: Record rendered?: Function @@ -107,13 +108,20 @@ export function createNuxtApp (options: CreateOptions) { data: {}, state: {}, _errors: {}, - ...(process.client ? window.__NUXT__ : { serverRendered: true }) + ...process.client ? window.__NUXT__ : {} }), isHydrating: process.client, _asyncDataPromises: {}, ...options } as any as NuxtApp + if (process.server) { + nuxtApp.payload.serverRendered = true + if (options.ssrContext?.event.req.headers['x-nitro-prerender']) { + nuxtApp.payload.prerenderedAt = Date.now() + } + } + nuxtApp.hooks = createHooks() nuxtApp.hook = nuxtApp.hooks.hook nuxtApp.callHook = nuxtApp.hooks.callHook diff --git a/packages/nuxt/src/auto-imports/presets.ts b/packages/nuxt/src/auto-imports/presets.ts index 678fa351d11..f4204361623 100644 --- a/packages/nuxt/src/auto-imports/presets.ts +++ b/packages/nuxt/src/auto-imports/presets.ts @@ -52,7 +52,7 @@ export const appPreset = defineUnimportPreset({ 'defineNuxtLink', 'usePayload', 'prefetchPayload', - 'isPrerendering' + 'isPrerender' ] }) From bf16a1a20ade58624fbf3c5814109d8b81b6f7be Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 9 Aug 2022 18:27:10 +0200 Subject: [PATCH 10/46] add random fixture --- packages/nuxt/package.json | 2 +- test/fixtures/basic/nuxt.config.ts | 9 +++++- test/fixtures/basic/pages/assets.vue | 4 +++ test/fixtures/basic/pages/random/[id].vue | 36 +++++++++++++++++++++++ test/fixtures/basic/server/api/random.ts | 3 ++ yarn.lock | 26 +++++----------- 6 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 test/fixtures/basic/pages/random/[id].vue create mode 100644 test/fixtures/basic/server/api/random.ts diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 17976c49e0e..79db9898d9e 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -52,7 +52,7 @@ "knitwork": "^0.1.2", "magic-string": "^0.26.2", "mlly": "^0.5.7", - "nitropack": "^0.4.15", + "nitropack": "^0.4.16", "nuxi": "^3.0.0-rc.6", "ohash": "^0.1.5", "ohmyfetch": "^0.4.18", diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index 331e50799ab..63e4b43a1d5 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -16,7 +16,14 @@ export default defineNuxtConfig({ './extends/node_modules/foo' ], nitro: { - output: { dir: process.env.NITRO_OUTPUT_DIR } + output: { dir: process.env.NITRO_OUTPUT_DIR }, + prerender: { + routes: [ + '/random/a', + '/random/b', + '/random/c' + ] + } }, publicRuntimeConfig: { testConfig: 123 diff --git a/test/fixtures/basic/pages/assets.vue b/test/fixtures/basic/pages/assets.vue index 121d4fe46e5..7e4a1264134 100644 --- a/test/fixtures/basic/pages/assets.vue +++ b/test/fixtures/basic/pages/assets.vue @@ -13,12 +13,16 @@ import logo from '~/assets/logo.svg'