You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.5 KiB
47 lines
1.5 KiB
const fs = require('fs');
|
|
const path = require('path');
|
|
const mkdirp = require('mkdirp');
|
|
const cosmiconfig = require('cosmiconfig');
|
|
const Prerenderer = require('@prerenderer/prerenderer');
|
|
const Puppeteer = require('@prerenderer/renderer-puppeteer');
|
|
|
|
module.exports = bundler => {
|
|
bundler.on('buildEnd', async () => {
|
|
if (process.env.NODE_ENV !== 'production') return;
|
|
const { outDir } = bundler.options;
|
|
const prerenderer = new Prerenderer({
|
|
staticDir: outDir,
|
|
renderer: new Puppeteer(),
|
|
});
|
|
let routes = ['/']; // the default route
|
|
const found = await cosmiconfig('prerender').search();
|
|
if (found) {
|
|
const { config } = found;
|
|
if (Array.isArray(config)) routes = config;
|
|
else ({ routes } = config);
|
|
}
|
|
console.log('\nRendering...');
|
|
try {
|
|
await prerenderer.initialize();
|
|
const start = Date.now();
|
|
const renderedRoutes = await prerenderer.renderRoutes(routes);
|
|
const end = Date.now();
|
|
renderedRoutes.forEach(route => {
|
|
try {
|
|
const outputDir = path.join(outDir, route.route);
|
|
const file = path.normalize(`${outputDir}/index.html`);
|
|
mkdirp.sync(outputDir);
|
|
fs.writeFileSync(file, route.html.trim());
|
|
const end = Date.now();
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
});
|
|
console.log(`Finished rendering in ${end - start}ms.`);
|
|
prerenderer.destroy();
|
|
} catch (err) {
|
|
prerenderer.destroy();
|
|
console.error(err);
|
|
}
|
|
});
|
|
};
|
|
|