const path = require("path"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); const babelOptions = { plugins: ["@babel/plugin-transform-runtime"], presets: ["@babel/preset-env", "@babel/preset-react"], }; module.exports = { entry: { frontend: "./src/frontend.tsx", backend: "./src/backend.js", }, output: { filename: "[name].js", path: path.resolve(__dirname, "build"), clean: true, }, module: { rules: [ { test: /\.ts(x?)$/, exclude: /node_modules/, use: [ { loader: "babel-loader", options: babelOptions, }, { loader: "ts-loader", }, ], }, { test: /\.js$/, exclude: /node_modules/, use: [ { loader: "babel-loader", options: babelOptions, }, ], }, { test: /\.css$/i, use: [MiniCssExtractPlugin.loader, "css-loader"], }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: "asset/resource", }, ], }, resolve: { extensions: [".tsx", ".ts", ".js"], }, plugins: [new MiniCssExtractPlugin()], optimization: { minimizer: [`...`, new CssMinimizerPlugin()], moduleIds: "deterministic", runtimeChunk: "single", splitChunks: { cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: "vendors", chunks: "all", }, }, }, }, };