const HtmlWebPackPlugin = require('html-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') const dotenv = require('dotenv') const webpack = require('webpack') const path = require('path') const prod = (process.env.NODE_ENV ? process.env.NODE_ENV : '').trim() === 'production' module.exports = () => { dotenv.config({ path: './.env', }) return { entry: './src/index.js', output: { filename: '[name].[contenthash].js', path: path.resolve(__dirname, 'dist'), assetModuleFilename: 'assets/[name][ext]', }, resolve: { extensions: ['.js', '.ts', '.tsx'], }, optimization: { runtimeChunk: 'single', moduleIds: 'deterministic', minimizer: [`...`, new CssMinimizerPlugin()], splitChunks: { cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all', }, styles: { name: 'styles', type: 'css/mini-extract', chunks: 'all', enforce: true, }, }, }, }, mode: prod ? 'production' : 'development', // Enable sourcemaps for debugging webpack's output. devtool: prod ? 'none' : 'eval-source-map', devServer: { historyApiFallback: true, }, node: { global: true, }, plugins: [ new webpack.DefinePlugin({ 'process.env': JSON.stringify(process.env), }), new HtmlWebPackPlugin({ template: './src/index.html', filename: './index.html', }), new CopyWebpackPlugin({ patterns: [ { from: 'src/static/images', to: 'resources/', }, ], }), new CopyWebpackPlugin({ patterns: [ { from: 'src/fonts', to: 'fonts/', }, ], }), new MiniCssExtractPlugin({ filename: '[name].css', }), new CleanWebpackPlugin(), ], module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', }, }, { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/, }, { test: /\.svg$/, exclude: /node_modules/, use: ['@svgr/webpack'], }, { test: /\.(sass|less|css|scss)$/, // include: path.resolve(__dirname), use: [ // fallback to style-loader in development process.env.NODE_ENV !== 'production' ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'resolve-url-loader', 'sass-loader', ], }, { test: /\.(gif|png|jpe?g)$/i, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { bypassOnDebug: true, disable: true, }, }, ], }, { test: /\.(woff|woff2|eot|ttf|otf)$/, // include: path.resolve(__dirname), type: 'asset/resource', generator: { filename: './fonts/[name][ext]', }, }, ], }, } }