const webpack = require("webpack"); const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); // const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; const UglifyJSPlugin = require("uglifyjs-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const CompressionPlugin = require("compression-webpack-plugin"); const config = { entry: { app: path.join(__dirname, "client", "index.js"), }, output: { path: path.join(__dirname, "dist", "data", "public"), publicPath: "/", filename: "assets/js/[name]_[chunkhash].js", chunkFilename: "assets/js/chunk_[name]_[id]_[chunkhash].js", }, module: { rules: [ { test: path.join(__dirname, "client"), use: ["babel-loader"], exclude: /node_modules/, }, { test: /\.html$/, loader: "html-loader", }, { test: /\.woff2$/, loader: "woff-loader", }, { test: /\.scss$/, loaders: ["style-loader", "css-loader", "sass-loader"], }, { test: /\.css$/, loaders: ["style-loader", "css-loader"], }, { test: /\.(pdf|jpg|png|gif|svg|ico|woff|woff2|eot|ttf)$/, loader: "url-loader", }, { test: /[a-z]+\.worker\.js$/, loader: "worker-loader", options: { name: "assets/js/[name]_[hash].js" }, }, ], }, plugins: [ new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV), }), new webpack.optimize.OccurrenceOrderPlugin(), new HtmlWebpackPlugin({ template: path.join(__dirname, "client", "index.html"), inject: true, minify: { collapseWhitespace: true, removeComments: true, minifyJS: true, minifyCSS: true, }, }), new CopyWebpackPlugin([ { from: "locales/*.json", to: "assets/" }, { from: "worker/*.js", to: "assets/" }, { from: "assets/logo/*" }, { from: "assets/icons/*" }, { from: "assets/fonts/*" }, ], { context: path.join(__dirname, "client") }), new CopyWebpackPlugin([ { from: "node_modules/pdfjs-dist/", to: "assets/vendor/pdfjs/2.6.347/" }, ]), // new BundleAnalyzerPlugin() ], }; if (process.env.NODE_ENV === "production") { config.plugins.push(new UglifyJSPlugin({ sourceMap: false, extractComments: true, })); config.plugins.push(new CompressionPlugin({ asset: "[path].gz[query]", algorithm: "gzip", test: /\.js$|\.json$|\.html$|\.svg|\.ico$/, threshold: 0, minRatio: 0.8, })); config.plugins.push(new CompressionPlugin({ asset: "[path].br[query]", algorithm: "brotliCompress", test: /\.js$|\.json$|\.html$|\.svg|\.ico$/, threshold: 0, minRatio: 0.8, })); } else { config.devtool = "#inline-source-map"; } module.exports = config;