64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
const ROUTES = ['/', '/about', '/404', '/posts', '/posts/viveahk', '/posts/librebasics']
|
|
|
|
const path = require('path')
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
const PrerenderSPAPlugin = require('prerender-spa-plugin')
|
|
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
|
|
const CopyPlugin = require('copy-webpack-plugin')
|
|
const { InjectManifest } = require('workbox-webpack-plugin')
|
|
const { JSDOM } = require('jsdom')
|
|
const tempy = require('tempy')
|
|
const fs = require('fs')
|
|
|
|
const magicFile = (text) => {
|
|
const p = tempy.file()
|
|
fs.writeFileSync(p, text)
|
|
return p
|
|
}
|
|
|
|
// const magicAppend = (orig, text, sep = '\n') => magicFile(fs.readFileSync(orig) + sep + text)
|
|
|
|
module.exports =
|
|
{
|
|
module: {
|
|
rules: [{
|
|
test: /\.elm$/,
|
|
exclude: [/elm-stuff/, /node_modules/],
|
|
loader: 'elm-webpack-loader'
|
|
}],
|
|
},
|
|
plugins: [
|
|
new HtmlWebpackPlugin(),
|
|
new CopyPlugin([{ from: 'data', to: 'data' }]),
|
|
new PrerenderSPAPlugin({
|
|
staticDir: path.join(__dirname, 'dist'),
|
|
routes: ROUTES,
|
|
minify: {
|
|
minifyCSS: true,
|
|
minifyJS: true,
|
|
removeComments: true,
|
|
},
|
|
renderer: new Renderer(),
|
|
postProcess(renderedRoute) {
|
|
const dom = new JSDOM(renderedRoute.html, { runScripts: 'outside-only' })
|
|
dom.window.eval(`
|
|
const sourceTarget = document.createElement('script')
|
|
sourceTarget.src = '/main.js'
|
|
document.body.appendChild(sourceTarget)
|
|
`)
|
|
return {
|
|
...renderedRoute,
|
|
html: dom.serialize(),
|
|
}
|
|
},
|
|
}),
|
|
new InjectManifest({
|
|
importWorkboxFrom: 'local',
|
|
swSrc: magicFile(`
|
|
workbox.routing.registerNavigationRoute('/index.html');
|
|
workbox.precaching.precacheAndRoute(self.__precacheManifest);
|
|
`),
|
|
swDest: 'sw.js',
|
|
}),
|
|
]
|
|
} |