Шаг 4. webpack.base.js и его настройка

Файл webpack.base.js является отправной точкой для всех остальных. В нём хранится вся логика, указывающая webpack, откуда и как брать файлы для работы, а также обработчики, относящиеся к файлам всевозможных форматов.

Выглядит файл следующим образом:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const fileName = ['index', 'two', 'three', 'four', 'five'];

module.exports = {
  context: path.resolve(__dirname, '../src'),
  entry: fileName.reduce((config = {}, file) => {
    config[file] = `./pages/${file}/${file}.js`;
    return config;
  }, {}),
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: 'js/[name].[contenthash].js',
    clean: true,
  },
  plugins: [].concat(
    fileName.map(
      (file) =>
        new HtmlWebpackPlugin({
          inject: 'head',
          template: `./pages/${file}/${file}.html`,
          filename: `./${file}.html`,
          chunks: [file],
          minify: {
            html5: true,
            collapseWhitespace: true,
            removeComments: true,
            removeTagWhitespace: true,
          },
        }),
    ),
    [].filter(Boolean),
  ),
  module: {
    rules: [
      {
        test: /\.(html)$/,
        use: ['html-loader'],
      },
      {
        test: /\.(s[ac]|c)ss$/i,
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader'],
      },
      {
        test: /\.(ts?|js?)$/,
        use: ['babel-loader'],
        exclude: /node_modules/,
      },
      {
        test: /\.(png|jpe?g|gif|svg|webp|ico|avif|mp3)$/i,
        type: 'asset',
        generator: {
          filename: 'assets/img/[name][hash][ext][query]',
        },
        parser: {
          dataUrlCondition: {
            maxSize: 10 * 1024,
          },
        },
      },
      {
        test: /\.(mp3|mp4|wav)$/i,
        type: 'asset',
        generator: {
          filename: 'assets/sound/[name][hash][ext][query]',
        },
        parser: {
          dataUrlCondition: {
            maxSize: 10 * 1024,
          },
        },
      },
      {
        test: /\.(woff2?|eot|ttf|otf)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'assets/font/[name].[ext]',
        },
        parser: {
          dataUrlCondition: {
            maxSize: 10 * 1024,
          },
        },
      },
    ],
  },
};

Чтобы увидеть разницу, мы убрали переменную styleHandler. Теперь после сборки проекта стили будут находиться в отдельной директории — для каждой страницы по отдельности.

Обратите внимание: в переменной fileName хранятся имена всех файлов, представленных в первом шаге демо, а в полях entry и  template (HtmlWebpackPlugin’a) мы их обрабатываем.

В поле filename HtmlWebpackPlugin’a необходимо указывать текущую директорию, то есть dist, и параметр file — это и есть имена файлов. Если этого не сделать, деплой на тот же Netlify или GitHub Pages станет весьма проблематичным, ведь у нас будут потеряны все пути и ссылки, позволяющие переходить по страницам.