1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00
next.js/packages/next/export/worker.js
Tim Neutkens 32451e979e
Move out requires from renderToHTML (#5915)
This brings us one step closer to outputting serverless functions as renderToHTML now renders the passed components, which allows us to bundle the renderToHTML function together with statically imported components in webpack.
2018-12-18 17:12:49 +01:00

64 lines
1.8 KiB
JavaScript

global.__NEXT_DATA__ = {
nextExport: true
}
const { extname, join, dirname, sep } = require('path')
const mkdirp = require('mkdirp-then')
const { renderToHTML } = require('next-server/dist/server/render')
const { writeFile } = require('fs')
const Sema = require('async-sema')
const {loadComponents} = require('next-server/dist/server/load-components')
process.on(
'message',
async ({
distDir,
buildId,
exportPaths,
exportPathMap,
outDir,
renderOpts,
concurrency
}) => {
const sema = new Sema(concurrency, { capacity: exportPaths.length })
try {
const work = async path => {
await sema.acquire()
const { page, query = {} } = exportPathMap[path]
const req = { url: path }
const res = {}
let htmlFilename = `${path}${sep}index.html`
if (extname(path) !== '') {
// If the path has an extension, use that as the filename instead
htmlFilename = path
} else if (path === '/') {
// If the path is the root, just use index.html
htmlFilename = 'index.html'
}
const baseDir = join(outDir, dirname(htmlFilename))
const htmlFilepath = join(outDir, htmlFilename)
await mkdirp(baseDir)
const components = await loadComponents(distDir, buildId, page)
const html = await renderToHTML(req, res, page, query, {...components, ...renderOpts})
await new Promise((resolve, reject) =>
writeFile(
htmlFilepath,
html,
'utf8',
err => (err ? reject(err) : resolve())
)
)
process.send({ type: 'progress' })
sema.release()
}
await Promise.all(exportPaths.map(work))
process.send({ type: 'done' })
} catch (err) {
console.error(err)
process.send({ type: 'error', payload: err })
}
}
)