Шаг 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 станет весьма проблематичным, ведь у нас будут потеряны все пути и ссылки, позволяющие переходить по страницам.