Combine sendPayload and sendHTML (#15475)
This commit is contained in:
parent
193ffe7616
commit
71bc0db92a
5 changed files with 37 additions and 52 deletions
|
@ -83,6 +83,7 @@ export function createEntrypoints(
|
|||
buildId,
|
||||
assetPrefix: config.assetPrefix,
|
||||
generateEtags: config.generateEtags,
|
||||
poweredByHeader: config.poweredByHeader,
|
||||
canonicalBase: config.canonicalBase,
|
||||
basePath: config.basePath,
|
||||
runtimeConfig: hasRuntimeConfig
|
||||
|
|
|
@ -22,6 +22,7 @@ export type ServerlessLoaderQuery = {
|
|||
buildId: string
|
||||
assetPrefix: string
|
||||
generateEtags: string
|
||||
poweredByHeader: string
|
||||
canonicalBase: string
|
||||
basePath: string
|
||||
runtimeConfig: string
|
||||
|
@ -43,6 +44,7 @@ const nextServerlessLoader: loader.Loader = function () {
|
|||
absoluteDocumentPath,
|
||||
absoluteErrorPath,
|
||||
generateEtags,
|
||||
poweredByHeader,
|
||||
basePath,
|
||||
runtimeConfig,
|
||||
previewProps,
|
||||
|
@ -266,7 +268,6 @@ const nextServerlessLoader: loader.Loader = function () {
|
|||
const {parse: parseQs} = require('querystring')
|
||||
const {renderToHTML} = require('next/dist/next-server/server/render');
|
||||
const { tryGetPreviewData } = require('next/dist/next-server/server/api-utils');
|
||||
const {sendHTML} = require('next/dist/next-server/server/send-html');
|
||||
const {sendPayload} = require('next/dist/next-server/server/send-payload');
|
||||
const buildManifest = require('${buildManifest}');
|
||||
const reactLoadableManifest = require('${reactLoadableManifest}');
|
||||
|
@ -494,9 +495,9 @@ const nextServerlessLoader: loader.Loader = function () {
|
|||
await initServer()
|
||||
const html = await renderReqToHTML(req, res)
|
||||
if (html) {
|
||||
sendHTML(req, res, html, {generateEtags: ${
|
||||
generateEtags === 'true' ? true : false
|
||||
}})
|
||||
sendPayload(req, res, html, 'html', {generateEtags: ${JSON.stringify(
|
||||
generateEtags === 'true'
|
||||
)}, poweredByHeader: ${JSON.stringify(poweredByHeader === 'true')}})
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err)
|
||||
|
|
|
@ -52,7 +52,6 @@ import Router, {
|
|||
route,
|
||||
Route,
|
||||
} from './router'
|
||||
import { sendHTML } from './send-html'
|
||||
import { sendPayload } from './send-payload'
|
||||
import { serveStatic } from './serve-static'
|
||||
import { IncrementalCache } from './incremental-cache'
|
||||
|
@ -813,7 +812,10 @@ export default class Server {
|
|||
html: string
|
||||
): Promise<void> {
|
||||
const { generateEtags, poweredByHeader } = this.renderOpts
|
||||
return sendHTML(req, res, html, { generateEtags, poweredByHeader })
|
||||
return sendPayload(req, res, html, 'html', {
|
||||
generateEtags,
|
||||
poweredByHeader,
|
||||
})
|
||||
}
|
||||
|
||||
public async render(
|
||||
|
@ -996,7 +998,10 @@ export default class Server {
|
|||
res,
|
||||
data,
|
||||
isDataReq ? 'json' : 'html',
|
||||
this.renderOpts.generateEtags,
|
||||
{
|
||||
generateEtags: this.renderOpts.generateEtags,
|
||||
poweredByHeader: this.renderOpts.poweredByHeader,
|
||||
},
|
||||
!this.renderOpts.dev
|
||||
? {
|
||||
private: isPreviewMode,
|
||||
|
@ -1126,7 +1131,10 @@ export default class Server {
|
|||
html = renderResult.html
|
||||
}
|
||||
|
||||
sendPayload(req, res, html, 'html', this.renderOpts.generateEtags)
|
||||
sendPayload(req, res, html, 'html', {
|
||||
generateEtags: this.renderOpts.generateEtags,
|
||||
poweredByHeader: this.renderOpts.poweredByHeader,
|
||||
})
|
||||
return null
|
||||
}
|
||||
|
||||
|
@ -1141,7 +1149,10 @@ export default class Server {
|
|||
res,
|
||||
isDataReq ? JSON.stringify(pageData) : html,
|
||||
isDataReq ? 'json' : 'html',
|
||||
this.renderOpts.generateEtags,
|
||||
{
|
||||
generateEtags: this.renderOpts.generateEtags,
|
||||
poweredByHeader: this.renderOpts.poweredByHeader,
|
||||
},
|
||||
!this.renderOpts.dev || (isServerProps && !isDataReq)
|
||||
? {
|
||||
private: isPreviewMode,
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
import { IncomingMessage, ServerResponse } from 'http'
|
||||
import generateETag from 'next/dist/compiled/etag'
|
||||
import fresh from 'next/dist/compiled/fresh'
|
||||
import { isResSent } from '../lib/utils'
|
||||
|
||||
export function sendHTML(
|
||||
req: IncomingMessage,
|
||||
res: ServerResponse,
|
||||
html: string,
|
||||
{
|
||||
generateEtags,
|
||||
poweredByHeader,
|
||||
}: { generateEtags: boolean; poweredByHeader: boolean }
|
||||
) {
|
||||
if (isResSent(res)) return
|
||||
const etag = generateEtags ? generateETag(html) : undefined
|
||||
|
||||
if (poweredByHeader) {
|
||||
res.setHeader('X-Powered-By', 'Next.js')
|
||||
}
|
||||
|
||||
if (fresh(req.headers, { etag })) {
|
||||
res.statusCode = 304
|
||||
res.end()
|
||||
return
|
||||
}
|
||||
|
||||
if (etag) {
|
||||
res.setHeader('ETag', etag)
|
||||
}
|
||||
|
||||
if (!res.getHeader('Content-Type')) {
|
||||
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
||||
}
|
||||
res.setHeader('Content-Length', Buffer.byteLength(html))
|
||||
res.end(req.method === 'HEAD' ? null : html)
|
||||
}
|
|
@ -8,7 +8,10 @@ export function sendPayload(
|
|||
res: ServerResponse,
|
||||
payload: any,
|
||||
type: 'html' | 'json',
|
||||
generateEtags: boolean,
|
||||
{
|
||||
generateEtags,
|
||||
poweredByHeader,
|
||||
}: { generateEtags: boolean; poweredByHeader: boolean },
|
||||
options?:
|
||||
| { private: true }
|
||||
| { private: boolean; stateful: true }
|
||||
|
@ -18,6 +21,10 @@ export function sendPayload(
|
|||
return
|
||||
}
|
||||
|
||||
if (poweredByHeader && type === 'html') {
|
||||
res.setHeader('X-Powered-By', 'Next.js')
|
||||
}
|
||||
|
||||
const etag = generateEtags ? generateETag(payload) : undefined
|
||||
|
||||
if (fresh(req.headers, { etag })) {
|
||||
|
@ -30,10 +37,12 @@ export function sendPayload(
|
|||
res.setHeader('ETag', etag)
|
||||
}
|
||||
|
||||
res.setHeader(
|
||||
'Content-Type',
|
||||
type === 'json' ? 'application/json' : 'text/html; charset=utf-8'
|
||||
)
|
||||
if (!res.getHeader('Content-Type')) {
|
||||
res.setHeader(
|
||||
'Content-Type',
|
||||
type === 'json' ? 'application/json' : 'text/html; charset=utf-8'
|
||||
)
|
||||
}
|
||||
res.setHeader('Content-Length', Buffer.byteLength(payload))
|
||||
if (options != null) {
|
||||
if (options.private || options.stateful) {
|
||||
|
@ -61,5 +70,5 @@ export function sendPayload(
|
|||
)
|
||||
}
|
||||
}
|
||||
res.end(payload)
|
||||
res.end(req.method === 'HEAD' ? null : payload)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue