From dab3750fcba19db9915cb4e82a00f42a25c730f3 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Aug 2022 15:07:13 +0200 Subject: [PATCH 1/6] fix(nuxt)!: allow `app:rendered` hook to modify ssr context --- packages/nuxt/src/app/nuxt.ts | 6 +++--- packages/nuxt/src/core/runtime/nitro/renderer.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index 2f5bc1ec72a..e933ae25271 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -6,8 +6,6 @@ import type { RuntimeConfig } from '@nuxt/schema' import { getContext } from 'unctx' import type { SSRContext } from 'vue-bundle-renderer/runtime' import type { CompatibilityEvent } from 'h3' -// eslint-disable-next-line import/no-restricted-paths -import type { NuxtRenderContext } from '../core/runtime/nitro/renderer' const nuxtAppCtx = getContext('nuxt-app') @@ -21,11 +19,13 @@ type NuxtMeta = { } type HookResult = Promise | void + +type AppRenderedContext = { ssrContext: NuxtApp['ssrContext'] } export interface RuntimeNuxtHooks { 'app:created': (app: App) => HookResult 'app:beforeMount': (app: App) => HookResult 'app:mounted': (app: App) => HookResult - 'app:rendered': (ctx: NuxtRenderContext) => HookResult + 'app:rendered': (ctx: AppRenderedContext) => HookResult 'app:redirected': () => HookResult 'app:suspense:resolve': (Component?: VNode) => HookResult 'app:error': (err: any) => HookResult diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index ab9d58042d5..9387c12952f 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -124,6 +124,7 @@ export default defineRenderHandler(async (event) => { const _rendered = await renderer.renderToString(ssrContext).catch((err) => { if (!ssrError) { throw err } }) + await ssrContext.nuxt?.hooks.callHook('app:rendered', { ssrContext }) // Handle errors if (!_rendered) { @@ -167,7 +168,6 @@ export default defineRenderHandler(async (event) => { // Allow hooking into the rendered result const nitroApp = useNitroApp() - await ssrContext.nuxt?.hooks.callHook('app:rendered', rendered) await nitroApp.hooks.callHook('nuxt:app:rendered', rendered) // Construct HTML response From d200412fe80f5b5a2292b05576583549df3acc58 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 11 Aug 2022 17:12:08 +0200 Subject: [PATCH 2/6] refactor!: change nitro `nuxt:app:rendered` to `render:html` --- .../nuxt/src/core/runtime/nitro/renderer.ts | 68 +++++++++---------- test/fixtures/basic/nuxt.d.ts | 8 +++ 2 files changed, 39 insertions(+), 37 deletions(-) create mode 100644 test/fixtures/basic/nuxt.d.ts diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 9387c12952f..943ba06406d 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -15,16 +15,13 @@ export type NuxtSSRContext = NuxtApp['ssrContext'] const defineRenderHandler = _defineRenderHandler as (h: RenderHandler) => CompatibilityEvent -export interface NuxtRenderContext { - ssrContext: NuxtSSRContext - html: { - htmlAttrs: string[] - head: string[] - bodyAttrs: string[] - bodyPreprend: string[] - body: string[] - bodyAppend: string[] - } +export interface NuxtRenderHTMLContext { + htmlAttrs: string[] + head: string[] + bodyAttrs: string[] + bodyPreprend: string[] + body: string[] + bodyAppend: string[] } export interface NuxtRenderResponse { @@ -138,41 +135,38 @@ export default defineRenderHandler(async (event) => { const renderedMeta = await ssrContext.renderMeta?.() ?? {} // Create render context - const rendered: NuxtRenderContext = { - ssrContext, - html: { - htmlAttrs: normalizeChunks([renderedMeta.htmlAttrs]), - head: normalizeChunks([ - renderedMeta.headTags, - _rendered.renderResourceHints(), - _rendered.renderStyles(), - ssrContext.styles - ]), - bodyAttrs: normalizeChunks([renderedMeta.bodyAttrs]), - bodyPreprend: normalizeChunks([ - renderedMeta.bodyScriptsPrepend, - ssrContext.teleports?.body - ]), - body: [ + const htmlContext: NuxtRenderHTMLContext = { + htmlAttrs: normalizeChunks([renderedMeta.htmlAttrs]), + head: normalizeChunks([ + renderedMeta.headTags, + _rendered.renderResourceHints(), + _rendered.renderStyles(), + ssrContext.styles + ]), + bodyAttrs: normalizeChunks([renderedMeta.bodyAttrs]), + bodyPreprend: normalizeChunks([ + renderedMeta.bodyScriptsPrepend, + ssrContext.teleports?.body + ]), + body: [ // TODO: Rename to _rendered.body in next vue-bundle-renderer - _rendered.html - ], - bodyAppend: normalizeChunks([ + _rendered.html + ], + bodyAppend: normalizeChunks([ ``, _rendered.renderScripts(), // Note: bodyScripts may contain tags other than