wand-front-utils/webpack.config.js
2019-12-12 01:25:34 -07:00

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',
}),
]
}