Задать вопрос
@svm2001

Как ускорить сборку webpack + pug?

Есть сборка на webpack + pug.
Конфиг:
const path = require('path'),
    HtmlWebpackPlugin = require('html-webpack-plugin'),
    FileManagerPlugin = require('filemanager-webpack-plugin'),
    MiniCssExtractPlugin = require('mini-css-extract-plugin'),
    CssMinimizerPlugin = require("css-minimizer-webpack-plugin"),
    // ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'),
    TerserPlugin = require("terser-webpack-plugin"),
    isProd = process.env.npm_lifecycle_event !== 'dev',
    needContentHash = false,
    baseLibs = ['device', 'hystmodal'],
    includeHtml = pages => {
        return pages.map(page => {
            return new HtmlWebpackPlugin({
                template: path.join(__dirname, page.path),
                filename: `${page?.folder ? `${page.folder}/` : ''}${page.name}.html`,
                chunks: ['main', ...baseLibs, ...page.chunk],
                inject: true,
                minify: false,
            })
        })
    },
    pages = [
        {
            name: 'index',
            path: 'dev/pages/index/index.pug',
            chunk: ['index'],
        },
    ],
    localPath = {
        localLibs: 'dev/assets/scripts/local-libs',
        scripts: 'dev/assets/scripts',
        pages: 'dev/pages'
    }

module.exports = {
    mode: isProd ? 'production' : 'development',
    entry: {
        device: path.join(__dirname, localPath.localLibs, 'device.min.js'),
        hystmodal: path.join(__dirname, localPath.localLibs, 'hystmodal.min.js'),
        main: path.join(__dirname, localPath.scripts, 'main.js'),
        index: path.join(__dirname, localPath.pages, 'index', 'index.js'),
    },
    output: {
        path: path.join(__dirname, 'build'),
        filename: path.join('assets', 'scripts', `${ needContentHash ? '[name].[contenthash].js' : '[name].js' }`),
        hashFunction: `sha256`,
    },
    resolve: {
        alias: {
            '@': path.join(__dirname, './dev'),
        },
        useSyncFileSystemCalls: true,
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                use: 'babel-loader',
                exclude: /node_modules/,
            },
            {
                test: /\.pug$/,
                loader: 'pug-loader',
                options: {
                    root: path.resolve(__dirname, './dev'),
                    minimize: false,
                    pretty: true,
                },
            },
            {
                test: /\.(scss|css)$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'postcss-loader',
                    'sass-loader',
                ],
            },
            {
                test: /\.(png|jpg|jpeg|gif)$/i,
                type: 'asset/resource',
                generator: {
                    filename: path.join('assets', 'images', `${ needContentHash ? '[name].[contenthash][ext]' : '[name][ext]' }`),
                },
            },
            {
                test: /\.(mp4|webm)$/i,
                type: 'asset/resource',
                generator: {
                    filename: path.join('assets', 'video', `${ needContentHash ? '[name].[contenthash][ext]' : '[name][ext]' }`),
                },
            },
            {
                test: /\.svg$/,
                type: 'asset/resource',
                generator: {
                    filename: path.join('assets', 'icons', `${ needContentHash ? '[name].[contenthash][ext]' : '[name][ext]' }`,),
                },
            },
            {
                test: /\.(woff2?|eot|ttf|otf)$/i,
                type: 'asset/resource',
                generator: {
                    filename: `assets/fonts/${ needContentHash ? '[name].[contenthash][ext]' : '[name][ext]' }`,
                },
            },
        ],
    },
    plugins: [
        ...includeHtml(pages),
        new FileManagerPlugin({
            events: {
                onStart: {
                    delete: ['build'],
                },
                onEnd: {
                    copy: [
                        {
                            source: path.join('dev', 'public'),
                            destination: 'build/public',
                        },
                    ],
                },
            },
        }),
        new MiniCssExtractPlugin({
            filename: path.join('assets', 'styles', `${ needContentHash ? '[name].[contenthash].css' : '[name].css' }`),
        }),
    ],
    devServer: {
        watchFiles: path.join(__dirname, 'dev'),
        port: 9000,
        static: [
            path.join(__dirname, 'dev', 'public'),
            path.join(__dirname, 'build'),
        ]
    },
    optimization: {
        minimizer: [
            new CssMinimizerPlugin(),
            new TerserPlugin(),
            // new ImageMinimizerPlugin({
            //     minimizer: {
            //         implementation: ImageMinimizerPlugin.imageminMinify,
            //         options: {
            //             plugins: [
            //                 ['gifsicle', { interlaced: true }],
            //                 ['jpegtran', { progressive: true }],
            //                 ['optipng', { optimizationLevel: 5 }],
            //                 ['svgo', { name: 'preset-default' }],
            //             ],
            //         },
            //     },
            // }),
        ],
    },
}


При запуске сборки (npm run serve) - запускается она за 70-80 сек. Это ок, я не жалуюсь.
Но когда сборка запущена и я начинаю делать изменения в pug файле - обновление сборки от 58 до 62 сек.
Это началось буквально сегодня, до этого дня сборка обновлялась также как с стили со скриптами
Примечательно, что js и scss обновляется за 1-2 сек, очень шустро
Также примечательно, что на проекте еще работает помимо меня 2 человека, естественно с этой сборкой. У них такой проблемы нет, pug файлы обновляются быстро, также как стили и скрипты.

Что можно сделать? Если что i5, 16 гб ОЗУ. Не топ, но для фронта должно хватать. И всегда хватало. Но не думаю, что дело в железе.
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Озадачился тем же вопросом.
14 страниц, 37 миксинов с вариантами внутри, половина "сквозных".
32 оперативки, ssd, core i7
Было.
Развернуть 2:30, собрать 3:00 (время округлено с отключенной оптимизацией картинок, с включенной 4:00).

Решение - https://www.npmjs.com/package/simple-pug-loader
Стало 10 сек.
Сквозные летают.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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