Skip to content

Commit

Permalink
Change --outDir to be transparent to user; try/catch whole prerender …
Browse files Browse the repository at this point in the history
…function to avoid server kill
  • Loading branch information
pierregradelet committed Jul 3, 2024
1 parent 66fb465 commit 83f1c7b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 62 deletions.
2 changes: 1 addition & 1 deletion apps/front/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"build:ssr-server": "vite build --ssr src/index-server.tsx --outDir dist/ssr/server",
"build:ssr": "npm run build:ssr-scripts && npm run build:ssr-client && npm run build:ssr-server",
"build:static-scripts": "vite build -c vite.static-scripts.config.ts",
"build:static-client": "vite build --outDir dist/static/_temp",
"build:static-client": "vite build --outDir dist/static/client",
"build:static": "npm run build:static-scripts && npm run build:static-client && npm run generate",
"generate": "node dist/static/scripts/exe-prerender.js",
"build": "npm run build:spa && npm run build:ssr && npm run build:static",
Expand Down
127 changes: 66 additions & 61 deletions apps/front/prerender/prerender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,70 +20,75 @@ import { rejects } from "assert"
* @param outDirStatic: Generation destination directory
*/
export const prerender = async (urls: string[]) => {
// Define output folders (_temp & client)
const outDirStatic = config.outDirStaticClient
const outDirStaticTemp = config.outDirStaticClientTemp

// Define if comes from :
// - build (npm run build:static)
// - generate (server /generate or npm run generate)
const isGenerate = !(await mfs.fileExists(`${outDirStaticTemp}/.vite/manifest.json`))

// get script tags to inject in render
const base = loadEnv("", process.cwd(), "").VITE_APP_BASE || process.env.VITE_APP_BASE
let manifest = null

// If from build, use manifest file from _temp/
if (!isGenerate) {
manifest = await mfs.readFile(`${outDirStaticTemp}/.vite/manifest.json`)
} else {
// Else from client/
manifest = await mfs.readFile(`${outDirStatic}/.vite/manifest.json`)
}
try {
// Define output folders (_temp & client)
const outDirStatic = config.outDirStaticClient
const outDirStaticTemp = config.outDirStaticClientTemp

// Define if comes from :
// - build (npm run build:static)
// - generate (server /generate or npm run generate)
const isGenerate = !(await mfs.fileExists(`${outDirStaticTemp}/.vite/manifest.json`))
console.log({ outDirStatic, outDirStaticTemp, isGenerate })

// get script tags to inject in render
const base = loadEnv("", process.cwd(), "").VITE_APP_BASE || process.env.VITE_APP_BASE
let manifest = null

// If from build, use manifest file from _temp/
if (!isGenerate) {
manifest = await mfs.readFile(`${outDirStaticTemp}/.vite/manifest.json`)
} else {
// Else from client/
manifest = await mfs.readFile(`${outDirStatic}/.vite/manifest.json`)
}

const scriptTags = ManifestParser.getScriptTagFromManifest(manifest, base)
let errorOnRender = false
const renderPromises: Promise<void>[] = []

// pre-render each route
for (let url of urls) {
let formattedURL = url.startsWith("/") ? url : `/${url}`

try {
// Request DOM
const dom = await render(formattedURL, scriptTags, true, base)
// create stream and generate current file when all DOM is ready
renderPromises.push(
new Promise<void>((resolve, rejects) => {
renderToPipeableStream(dom, {
onAllReady: async () => {
await createHtmlFile(urls, formattedURL, outDirStaticTemp, dom)
resolve()
},
onError(x) {
errorOnRender = true
console.error(x)
rejects(new Error("Error on renderToPipeableStream"))
}
const scriptTags = ManifestParser.getScriptTagFromManifest(manifest, base)
let errorOnRender = false
const renderPromises: Promise<void>[] = []

// pre-render each route
for (let url of urls) {
let formattedURL = url.startsWith("/") ? url : `/${url}`

try {
// Request DOM
const dom = await render(formattedURL, scriptTags, true, base)
// create stream and generate current file when all DOM is ready
renderPromises.push(
new Promise<void>((resolve, rejects) => {
renderToPipeableStream(dom, {
onAllReady: async () => {
await createHtmlFile(urls, formattedURL, outDirStaticTemp, dom)
resolve()
},
onError(x) {
errorOnRender = true
console.error(x)
rejects(new Error("Error on renderToPipeableStream"))
}
})
})
})
)
} catch (e) {
console.log(e)
)
} catch (e) {
console.log(e)
}
}
}
await Promise.all(renderPromises)

if (errorOnRender) {
console.error(chalk.red("Error on render"))
process.exit(1)
} else if (!isGenerate) {
// If from build, move whole folder
await moveFolder(outDirStatic, "dist/static/old")
await moveFolder(outDirStaticTemp, outDirStatic)
} else {
// If from generate, move html files only
await moveHTML(outDirStaticTemp, outDirStatic)
await Promise.all(renderPromises)

if (errorOnRender) {
console.error(chalk.red("Error on render"))
process.exit(1)
} else if (!isGenerate) {
// If from build, move whole folder
await moveFolder(outDirStatic, "dist/static/old")
await moveFolder(outDirStaticTemp, outDirStatic)
} else {
// If from generate, move html files only
await moveHTML(outDirStaticTemp, outDirStatic)
}
} catch (e) {
console.error(e)
}
}

Expand Down

0 comments on commit 83f1c7b

Please sign in to comment.