process.env.NODE_ENV = 'production'; const path = require('path'); const merge = require('webpack-merge'); const common = require('./webpack.common.js'); const keepAsset = require('./keepAsset.js'); //const CompressionPlugin = require("compression-webpack-plugin"); const WebpackOnBuildPlugin = require('on-build-webpack'); //const TerserJSPlugin = require('terser-webpack-plugin'); //const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const fs = require('fs'); const buildDir = __dirname + '/public/'; module.exports = merge(common, { mode: 'production', devtool: 'source-map', optimization: { //minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], //runtimeChunk: 'single', splitChunks: { chunks: 'all', maxInitialRequests: Infinity, //minSize: 0, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { // get the name. E.g. node_modules/packageName/not/this/part.js // or node_modules/packageName const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]; // npm package names are URL-safe, but some servers don't like @ symbols return `npm.${packageName.replace('@', '')}`; }, }, }, } }, plugins: [ /* new CompressionPlugin({ filename: '[path].gz[query]', algorithm: 'gzip', test: /\.(js|css|html|svg)$/, threshold: 10240, minRatio: 0.8, }), */ /* new CompressionPlugin({ filename: '[path].br[query]', algorithm: 'brotliCompress', test: /\.(js|css|html|svg)$/, compressionOptions: { level: 11 }, threshold: 10240, minRatio: 0.8, deleteOriginalAssets: false, }), */ new WebpackOnBuildPlugin(function(stats) { const newlyCreatedAssets = stats.compilation.assets; const unlinked = []; fs.readdir(path.resolve(buildDir), (err, files) => { files.forEach(file => { //console.log('to unlink 1:', file); if(keepAsset(file)) { return; } // if(file.includes('.xml') // || file.includes('.webmanifest') // || file.includes('.wasm') // || file.includes('rlottie-wasm') // || file.includes('Worker.min.js') // || file.includes('recorder.min.js') // || file.includes('.hbs')) return; let p = path.resolve(buildDir + file); if(!newlyCreatedAssets[file] && ['.gz', '.js', '.ts', '.map', '.css', '.txt'].find(ext => file.endsWith(ext)) !== undefined) { //console.log('to unlink 2:', file); fs.unlinkSync(p); unlinked.push(file); } }); if(unlinked.length > 0) { console.log('Removed old assets: ', unlinked); } }); }) ] });