Как можно настроить минимизацию в Webpack?

Добрый день! <br/> У меня есть проект, который использует TypeScript и React, и я собираю его с помощью Webpack. <br/> Можете посмотреть на мой конфигурационный файл и дать советы по его улучшению? <br/> Вот как выглядит мой конфиг: <br/> <pre><code class="javascript">const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const TerserPlugin = require("terser-webpack-plugin");

const app = {
    mode: "production",
    entry: "./src/start.jsx",
    optimization: {
        minimize: true,
        minimizer: [
        new TerserPlugin({
            terserOptions: {
            mangle: true,
            keep_classnames: true,
            },
        }),
        ]
    },
    output: {
        filename: (pathData) =&gt; {
            const date = new Date().toJSON().slice(0,10);
            var seconds = new Date().getTime() / 10000;
            return date + '.' + Math.round(seconds) + '.app.js';
        },
        path: path.resolve(__dirname, 'dist'),
    },
    optimization: {
        minimize: false,
    },
    plugins: [
        new HTMLWebpackPlugin({
            template: './src/index.html'
        }),
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename: (pathData) =&gt; {
                const date = new Date().toJSON().slice(0,10);
                var seconds = new Date().getTime() / 10000;
                return date + '.' + Math.round(seconds) + '.app.css';
            },
        }),
    ],
    resolve: {
        alias: {
            '@': path.join(__dirname, './src/'),
        },
        extensions: ['.jsx', '.tsx', '.ts', '.d.ts', '.js', '.css'],
    },
    module: {
        rules: 
  • 23 апреля 2025 г. 19:55
Ответы на вопрос 2
Добрый день! Чтобы настроить минимизацию в вашем проекте с использованием Webpack, вы уже на правильном пути, используя `TerserPlugin`. Однако, в вашем конфигурационном файле есть некоторые моменты, которые требуют исправления и оптимизации.

1. **Удалите дублирование `optimization`:** У вас есть два блока `optimization`. Это приведет к тому, что только второй блок будет применен. Вам нужно объединить их в один.

2. **Минимизация CSS:** Вы также можете минимизировать CSS, используя плагин `MiniCssExtractPlugin`. Он может работать в сочетании с `css-minimizer-webpack-plugin`.

3. **Настройка TerserPlugin:** Вы можете настроить TerserPlugin более детально, в зависимости от ваших потребностей.

Вот пример конфигурации с учетом вышеописанных изменений:

```javascript
const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const TerserPlugin = require("terser-webpack-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

const app = {
    mode: "production",
    entry: "./src/start.jsx",
    output: {
        filename: (pathData) => {
            const date = new Date().toJSON().slice(0, 10);
            var seconds = new Date().getTime() / 10000;
            return date + '.' + Math.round(seconds) + '.app.js';
        },
        path: path.resolve(__dirname, 'dist'),
        clean: true, // Включает автоматическую очистку выходной директории
    },
    optimization: {
        minimize: true,
        minimizer: [
            new TerserPlugin({
                terserOptions: {
                    mangle: true,
                    keep_classnames: true,
                },
                // Добавьте дополнительные параметры для улучшения производительности
                parallel: true,
            }),
            new CssMinimizerPlugin(),
        ],
    },
    plugins: [
        new HTMLWebpackPlugin({
            template: './src/index.html'
        }),
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename: (pathData) => {
                const date = new Date().toJSON().slice(0, 10);
                var seconds = new Date().getTime() / 10000;
                return date + '.' + Math.round(seconds) + '.app.css';
            },
        }),
    ],
    resolve: {
        alias: {
            '@': path.join(__dirname, './src/'),
        },
        extensions: ['.jsx', '.tsx', '.ts', '.d.ts', '.js', '.css'],
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx|ts|tsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                },
            },
            {
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    "css-loader",
                ],
            },
            // Добавьте правила для других типов файлов, если необходимо
        ]
    }
};

module.exports = app;
```

### Основные изменения:

- **Объединение optimization:** Все настройки минимизации объединены в один объект.
- **CssMinimizerPlugin:** Этот плагин добавлен для минимизации CSS-файлов.
- **Параметр `clean` в `output`:** Включает автоматическую очистку выходной директории перед каждой сборкой.
- **Параллелизация в TerserPlugin:** Это может помочь ускорить процесс сборки, используя мультипоточность.

Обязательно убедитесь, что у вас установлены все необходимые зависимости, включая `css-minimizer-webpack-plugin`, если его нет. Удачи с вашим проектом!
По идее, первый optimization будет перезаписан вторым optimization=false. Либо удалите второй блок, либо замените его на такой: 
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");

optimization: {
    minimize: true,
    minimizer: [
        new TerserPlugin({
            terserOptions: {
                mangle: true,
                keep_classnames: true,
                keep_fnames: false,
            },
        }),
        new CssMinimizerPlugin(),
    ],
    splitChunks: {
       chunks: 'all',
    },
},

Я ожидаю что в бандле будут переименованы хотя бы локальные переменные, чтобы как-то защитить код.

Минимизация !== обфускация, код может быть изменен, но не с целью "защиты".
Похожие вопросы