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