Skip to content
This repository was archived by the owner on Apr 6, 2023. It is now read-only.

Commit 5a2616c

Browse files
authored
perf(nitro): respond with early hints in node-based environments (#7893)
1 parent 9521fc7 commit 5a2616c

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

packages/nuxt/src/core/runtime/nitro/renderer.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createRenderer } from 'vue-bundle-renderer/runtime'
1+
import { createRenderer, renderResourceHeaders } from 'vue-bundle-renderer/runtime'
22
import type { RenderResponse } from 'nitropack'
33
import type { Manifest } from 'vite'
44
import { appendHeader, getQuery } from 'h3'
@@ -100,7 +100,10 @@ const getSPARenderer = lazyCachedFunction(async () => {
100100
return Promise.resolve(result)
101101
}
102102

103-
return { renderToString }
103+
return {
104+
rendererContext: renderer.rendererContext,
105+
renderToString
106+
}
104107
})
105108

106109
const PAYLOAD_CACHE = (process.env.NUXT_PAYLOAD_EXTRACTION && process.env.prerender) ? new Map() : null // TODO: Use LRU cache
@@ -150,6 +153,14 @@ export default defineRenderHandler(async (event) => {
150153

151154
// Render app
152155
const renderer = (process.env.NUXT_NO_SSR || ssrContext.noSSR) ? await getSPARenderer() : await getSSRRenderer()
156+
157+
// Render 103 Early Hints
158+
if (!isRenderingPayload && !process.env.prerender && event.res.socket) {
159+
const { link } = renderResourceHeaders({}, renderer.rendererContext)
160+
// TODO: use https://github.com/nodejs/node/pull/44180 when we drop support for node 16
161+
event.res.socket!.write(`HTTP/1.1 103 Early Hints\r\nLink: ${link}\r\n\r\n`, 'utf-8')
162+
}
163+
153164
const _rendered = await renderer.renderToString(ssrContext).catch((err) => {
154165
if (!ssrError) {
155166
// Use explicitly thrown error in preference to subsequent rendering errors

0 commit comments

Comments
 (0)