diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 98cfba67fc4..085e5564c22 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -30,7 +30,9 @@ interface RenderResult { } // @ts-ignore -const getClientManifest = () => import('#build/dist/server/client.manifest.mjs').then(r => r.default || r) +const getClientManifest = () => import('#build/dist/server/client.manifest.mjs') + .then(r => r.default || r) + .then(r => typeof r === 'function' ? r() : r) // @ts-ignore const getServerEntry = () => process.env.NUXT_NO_SSR ? Promise.resolve(null) : import('#build/dist/server/server.mjs').then(r => r.default || r) @@ -46,15 +48,22 @@ const getSSRRenderer = lazyCachedFunction(async () => { if (!createSSRApp) { throw new Error('Server bundle is not available') } // Create renderer - const renderToString = async (input, context) => { - const html = await _renderToString(input, context) - return `
${html}
` - } - return createRenderer(createSSRApp, { + const renderer = createRenderer(createSSRApp, { clientManifest, renderToString, publicPath: buildAssetsURL() }) + + async function renderToString (input, context) { + const html = await _renderToString(input, context) + // In development with vite-node, the manifest is on-demand and will be available after rendering + if (process.dev && process.env.NUXT_VITE_NODE_OPTIONS) { + renderer.rendererContext.updateManifest(await getClientManifest()) + } + return `
${html}
` + } + + return renderer }) // -- SPA Renderer -- diff --git a/packages/vite/src/runtime/client.manifest.mjs b/packages/vite/src/runtime/client.manifest.mjs index f69d7371d26..f33e3b2a794 100644 --- a/packages/vite/src/runtime/client.manifest.mjs +++ b/packages/vite/src/runtime/client.manifest.mjs @@ -3,6 +3,4 @@ import { getViteNodeOptions } from './vite-node-shared.mjs' const viteNodeOptions = getViteNodeOptions() -const manifest = await $fetch('/manifest', { baseURL: viteNodeOptions.baseURL }) - -export default manifest +export default () => $fetch('/manifest', { baseURL: viteNodeOptions.baseURL })