Skip to content

Commit

Permalink
enable async rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
wardpeet committed Jul 1, 2021
1 parent adb57ca commit e744840
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 13 deletions.
35 changes: 35 additions & 0 deletions packages/gatsby/cache-dir/server-utils/writable-as-promise.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Writable } from "stream"

export class WritableAsPromise extends Writable {
constructor() {
super()

this._output = ``
this._deferred = {
promise: null,
resolve: null,
reject: null,
}
this._deferred.promise = new Promise((resolve, reject) => {
this._deferred.resolve = resolve
this._deferred.reject = reject
})
}

_write(chunk, enc, cb) {
this._output += chunk.toString()

cb()
}

end() {
this._deferred.resolve(this._output)

this.destroy()
}

// disguise us as a promise
then(resolve, reject) {
return this._deferred.promise.then(resolve, reject)
}
}
28 changes: 26 additions & 2 deletions packages/gatsby/cache-dir/static-entry.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
const React = require(`react`)
const path = require(`path`)
const { renderToString, renderToStaticMarkup } = require(`react-dom/server`)
const {
renderToString,
renderToStaticMarkup,
pipeToNodeWritable,
} = require(`react-dom/server`)
const { ServerLocation, Router, isRedirect } = require(`@gatsbyjs/reach-router`)
const { merge, flattenDeep, replace } = require(`lodash`)
const { StaticQueryContext } = require(`gatsby`)
Expand Down Expand Up @@ -260,7 +264,27 @@ export default async function staticPage({
// If no one stepped up, we'll handle it.
if (!bodyHtml) {
try {
bodyHtml = renderToString(bodyComponent)
// react 18 enabled
if (pipeToNodeWritable) {
const {
WritableAsPromise,
} = require(`./server-utils/writable-as-promise`)
const writableStream = new WritableAsPromise()
const { startWriting } = pipeToNodeWritable(
bodyComponent,
writableStream,
{
onCompleteAll() {
startWriting()
},
onError() {},
}
)

bodyHtml = await writableStream
} else {
bodyHtml = renderToString(bodyComponent)
}
} catch (e) {
// ignore @reach/router redirect errors
if (!isRedirect(e)) throw e
Expand Down
4 changes: 2 additions & 2 deletions packages/gatsby/src/commands/build-html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ const renderHTMLQueue = async (
payload: pageSegment,
})

for (const [_pagePath, arrayOfUsages] of Object.entries(
for (const [, arrayOfUsages] of Object.entries(
htmlRenderMeta.unsafeBuiltinsUsageByPagePath
)) {
for (const unsafeUsageStack of arrayOfUsages) {
Expand All @@ -249,7 +249,7 @@ const renderHTMLQueue = async (
})
} catch (e) {
if (e?.context?.unsafeBuiltinsUsageByPagePath) {
for (const [_pagePath, arrayOfUsages] of Object.entries(
for (const [, arrayOfUsages] of Object.entries(
e.context.unsafeBuiltinsUsageByPagePath
)) {
// @ts-ignore TS doesn't know arrayOfUsages is Iterable
Expand Down
23 changes: 14 additions & 9 deletions packages/gatsby/src/commands/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,15 +210,20 @@ module.exports = async function build(program: IBuildArgs): Promise<void> {
buildSSRBundleActivityProgress.end()
}

const {
toRegenerate,
toDelete,
} = await buildHTMLPagesAndDeleteStaleArtifacts({
program,
pageRenderer,
workerPool,
buildSpan,
})
let toRegenerate
let toDelete

try {
;({ toRegenerate, toDelete } = await buildHTMLPagesAndDeleteStaleArtifacts({
program,
pageRenderer,
workerPool,
buildSpan,
}))
} catch (err) {
await Promise.all([waitForCompilerClose, waitForCompilerCloseBuildHtml])
report.panic(err)
}

telemetry.addSiteMeasurement(`BUILD_END`, {
pagesCount: toRegenerate.length, // number of html files that will be written
Expand Down
1 change: 1 addition & 0 deletions packages/gatsby/src/utils/worker/child/render-html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ export const renderHTMLProd = async ({
path: pagePath,
unsafeBuiltinsUsageByPagePath,
}

throw e
}
},
Expand Down

0 comments on commit e744840

Please sign in to comment.