@alexovn

Как правильно разделить код на webpack?

Впервые создаю многостраничный сайт, до этого делал лендинги. Решил поработать над оптимизацией кода.

В index.html подключаю два js-бандла: main.bundle.min.js, vendor.bundle.min.js.
В vendor.bundle.min.js лежит вендорный код из node_modules (plugin-1.js, plugin-2.js, plugin-3.js и т.д.) и код из папки files(сторонние плагины, которые нельзя установить через npm), а в main.bundle.min.js находится мой кастомный код + объявление плагинов с их настройками. Все работает отлично.

Как быть с другими страницами? Если к примеру на странице about.html мне не нужен plugin-2.js(и объявление этого плагина с его настройками из main.bundle.min.js), но нужны plugin-1.js и plugin-3.js из vendor.bundle.min.js. Что нужно сделать что бы не загружать лишний код? Прикрепил данные из моего webpack.config.js.

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
    mode: "production",
    optimization: {
        runtimeChunk: 'single',
        splitChunks: {
            cacheGroups: {
                vendorJS: {
                    name: 'vendor',
                    test: /[\\/]node_modules[\\/]|files[\\/]/,
                    chunks: 'all',
                    enforce: true,
                },
                vendorCSS: {
                    name: 'vendor',
                    type: 'css/mini-extract',
                    chunks: 'all',
                    enforce: true,
                },
            }
        },
        minimizer: [
            new TerserPlugin({
                terserOptions: {
                    format: {
                        comments: false,
                    },
                },
                extractComments: false,
            }),
            new CssMinimizerPlugin(),
        ]
    },
    output: {
        filename: '[name].bundle.min.js',
        chunkFilename: '[name].bundle.min.js',
    },
    module: {
        rules: [
            {
                test: /\.(js)$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                    }
                }
            },
            {
                test: /\.(sa|sc|c)ss$/,
                use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
            },
            {
                test: /\.(png|svg|jpg|jpeg|gif|woff|woff2|eot|ttf|)$/i,
                use: {
                    loader: 'file-loader',
                    options: {
                        name: "[name].[ext]",
                        outputPath: "../fonts/webfonts", 
                        }
                }
            },
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: "../css/[name].min.css",
        }),
    ],
};
  • Вопрос задан
  • 345 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы