-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
51 lines (41 loc) · 1.42 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import fs from 'fs'
import path from 'path'
import { promisify } from 'util'
import Prerenderer from '@prerenderer/prerenderer'
import Puppeteer from '@prerenderer/renderer-puppeteer'
const mkdirAsync = promisify(fs.mkdir)
const existsAsync = promisify(fs.exists)
const writeFileAsync = promisify(fs.writeFile)
const startPrerenderer = async (options) => {
const { staticDir, routes, puppeteer = {}, ...config } = options
if (!staticDir) throw Error('`staticDir` must be of type `string`')
if (!routes || routes.length === 0) throw Error('`routes` must be of type `string[]`')
const renderer = new Puppeteer(puppeteer)
const prerenderer = new Prerenderer({ renderer, staticDir, ...config })
await prerenderer.initialize()
const rendered = await prerenderer.renderRoutes(routes)
for (const route of rendered) {
try {
const out = path.join(staticDir, route.route)
const file = path.normalize(`${out}/index.html`)
const dirExists = await existsAsync(out)
if (!dirExists) await mkdirAsync(out)
console.info(`Rendering route "${route.route}"...`)
await writeFileAsync(file, route.html)
} catch (e) {
console.warn(e)
}
}
prerenderer.destroy()
}
const prerenderSpaPlugin = (options = {}) => ({
name: 'prerenderSpaPlugin',
writeBundle: () => {
try {
startPrerenderer(options)
} catch (e) {
console.error(e)
}
}
})
export default prerenderSpaPlugin