diff --git a/docs/content/3.api/4.advanced/1.hooks.md b/docs/content/3.api/4.advanced/1.hooks.md index 83f8dd48411..80f3004e307 100644 --- a/docs/content/3.api/4.advanced/1.hooks.md +++ b/docs/content/3.api/4.advanced/1.hooks.md @@ -16,6 +16,7 @@ Hook | Arguments | Description `app:suspense:resolve` | `appComponent` | On [Suspense](https://vuejs.org/guide/built-ins/suspense.html#suspense) resolved event `page:start` | `pageComponent` | On [Suspense](https://vuejs.org/guide/built-ins/suspense.html#suspense) pending event `page:finish` | `pageComponent` | On [Suspense](https://vuejs.org/guide/built-ins/suspense.html#suspense) resolved event +`page:rendered` | `html` | When SSR rendering for the whole page is done `meta:register` | `metaRenderers` | (internal) `vue:setup` | - | (internal) diff --git a/packages/nuxt3/src/app/nuxt.ts b/packages/nuxt3/src/app/nuxt.ts index 10c247d6813..310c5bd0fbb 100644 --- a/packages/nuxt3/src/app/nuxt.ts +++ b/packages/nuxt3/src/app/nuxt.ts @@ -23,6 +23,7 @@ export interface RuntimeNuxtHooks { 'app:beforeMount': (app: App) => HookResult 'app:mounted': (app: App) => HookResult 'app:rendered': () => HookResult + 'page:rendered': (html: string) => HookResult 'app:suspense:resolve': (Component?: VNode) => HookResult 'app:error': (err: any) => HookResult 'app:error:cleared': (options: { redirect?: string }) => HookResult diff --git a/packages/nuxt3/src/core/runtime/nitro/renderer.ts b/packages/nuxt3/src/core/runtime/nitro/renderer.ts index 1c7927e2b4b..97f3aa03597 100644 --- a/packages/nuxt3/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt3/src/core/runtime/nitro/renderer.ts @@ -133,6 +133,7 @@ export default eventHandler(async (event) => { event.res.setHeader('Content-Type', 'text/javascript;charset=UTF-8') } else { data = await renderHTML(payload, rendered, ssrContext) + await ssrContext.nuxt.hooks.callHook('page:rendered')(data) event.res.setHeader('Content-Type', 'text/html;charset=UTF-8') }