Skip to content
Snippets Groups Projects
webpack.common.js 1.91 KiB
Newer Older
Matthias Konitzny's avatar
Matthias Konitzny committed
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

const babelOptions = {
    presets: ["@babel/preset-env", "@babel/preset-react"],
};

module.exports = {
    entry: {
        frontend: "./src/frontend.tsx",
    },
    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,
Matthias Konitzny's avatar
Matthias Konitzny committed
                use: [MiniCssExtractPlugin.loader, "css-loader"],
            },
            {
                test: /\.(png|svg|jpg|jpeg|gif)$/i,
                type: "asset/resource",
            },
        ],
    },
    resolve: {
        extensions: [".tsx", ".ts", ".js"],
    },
Matthias Konitzny's avatar
Matthias Konitzny committed
    plugins: [new MiniCssExtractPlugin()],
Matthias Konitzny's avatar
Matthias Konitzny committed
        minimizer: [`...`, new CssMinimizerPlugin()],
        moduleIds: "deterministic",
        runtimeChunk: "single",
        splitChunks: {
            cacheGroups: {
                vendor: {
                    test: /[\\/]node_modules[\\/]/,
                    name: "vendors",
                    chunks: "all",
                },
            },
        },
    },
};