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, "server", "ctrl", "static", "www"), 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$/, use: "html-loader", }, { test: /\.woff2$/, use: "woff-loader", }, { test: /\.scss$/, use: [ { loader: "style-loader" }, { loader: "css-loader" }, { loader: "sass-loader" }, ], }, { test: /\.css$/, use: [ { loader: "style-loader" }, { 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 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/img/*" }, { from: "assets/icons/*" }, { from: "assets/fonts/*" }, ], { context: path.join(__dirname, "client") }), new CopyWebpackPlugin([ { from: "node_modules/pdfjs-dist/build/*.js", to: "assets/vendor/" }, { from: "node_modules/pdfjs-dist/cmaps/*", to: "assets/vendor/" }, ]), // new BundleAnalyzerPlugin() ], resolve: { fallback: { "path": require.resolve("path-browserify"), "crypto": require.resolve("crypto-browserify"), "buffer": require.resolve("buffer/"), "stream": require.resolve("stream-browserify"), "vm": require.resolve("vm-browserify"), }, }, mode: process.env.NODE_ENV || "production", }; 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;