Найти в Дзене
Дело было вечером

Устанавливаем и настраиваем Webpack — инструкция для новичков

Для начала создадим файл package.json. Для этого введём в терминале команду npm init (заранее нужно установить Node.js).

Затем установим webpack командой npm i webpack --save-dev.

Все пакеты для разработки можно разделить на два типа: те, что нужны в финальной сборке, этот код загрузится к клиенту на компьютер, и те, что нужны при разработке проекта. В файле package.json есть разделы: dependencies и devDependencies. Они разделяют пакеты. В dependencies указываем пакеты для финальной сборки, в devDependencies — пакеты для разработки. Флаг --save-dev показывает терминалу, что пакет нужно добавить в раздел devDependencies.

Дальше установим интерфейс webpack CLI для работы с вебпаком — npm i webpack-cli --save-dev.

Вебпак установлен, осталось его настроить.

В блок "scripts": { .. } записываем последовательность команд для сборки. Логика каждой команды уже прописана под капотом у «Вебпака». Об этом нам можно не волноваться :)

Скрипт финальной сборки проекта — "build": "webpack". Добавим его в блок "scripts".

Любой скрипт запускается командой npm run имя скрипта. Запустим npm run build.

! Для того, чтобы команда сработала без ошибок, «Вебпаку» нужно показать, куда идти в первую очередь. По умолчанию точка входа — файл index.js внутри папки src. Поэтому создадим в папке проекта директорию src, а в ней — файл index.js.

В папке проекта появилась директория dist, а внутри неё — файл main.js. В этот файл будет приходить весь js-код проекта.

Чтобы в папке dist не скапливались файлы, её лучше очищать перед каждой сборкой. Для этого заменим скрипт "build" — "build": "rm -rf dist && webpack --mode production". Здесь мы указали, что это сборка для финальной подготовки файлов к публикации.

Одной сборки недостаточно. Допишем команду сборки для разработки — "dev": "webpack serve".

Правила, по которым «Вебпаку» предстоит собирать код, пропишем в конфигурационном файле: webpack.config.js в корне проекта.

Настройки будем записывать в объект module.exports.

Необязательно использовать точку входа по умолчанию. Её можно указать — это объект entry. Ему нужно прописать путь к точке входа в свойстве main:

module.exports = {
entry: { main: './src/index.js' }
}

Кроме точки входа есть точка выхода — итоговый файл, куда «Вебпак» сложит весь код. Её нужно указать в объекте output. У этого объекта 3 свойства: путь к точке выхода, имя файла, куда «Вебпак» положит код, и свойство для обновления путей внутри CSS- и HTML-файлов. «Вебпак» не понимает относительный путь для точки выхода. Но в Node.js есть утилита, которая превращает относительный путь в абсолютный. Она называется path, а подключить его в файл можно функцией require: const path = require('path');

Теперь опишем точку выхода:

В свойстве path мы указали вызов метода path.resolve. Ему переданы два аргумента: ссылка на текущую папку __dirname и относительный путь к точке выхода.

Добавим в module.exports режим разработчика — mode: 'development'.

Настройки локального сервера добавим в объект devServer:

Теперь займёмся транспиляцией — переводом нового синтаксиса в старый. Чтобы каждый браузер понял наш код. Чтобы её выполнить, нам нужен будет очередной NPM-пакет — Babel: npm i @babel/core --save-dev.

Затем установим самый популярный пресет (набор готовых правил) бабель: npm i @babel/preset-env --save-dev.

Иногда изменить синтаксис мало. Например, в старых версиях некоторых браузеров может не быть некоторых методов. Тогда нужно загрузить недостающую функциональность в браузер пользователя вместе с проектом. Такие аналоги новой функциональности называются полифилы. Babel использует библиотеку полифилов core-js, установим её: npm i core-js --save. Эта зависимость нужна в итоговой сборке, поэтому используем флаг --save.

Подключить Babel к Webpack поможет пакет babel-loader: npm i babel-loader --save-dev.

Теперь настроим Babel.

Создадим файл babel.config.js в корне проекта. Заполним его:

Чтобы Webpack задействовал Babel при сборке, добавим код в файл конфигурации Webpack — webpack.config.js:

Настроим обработку HTML файлов

Установим плагин, который учит «Вебпак» работать с html-файлами: npm i html-webpack-plugin --save-dev.

Подключим его вверху файла webpack.config.js: const HtmlWebpackPlugin = require('html-webpack-plugin');

В конец объекта module.exports добавим новое свойство — массив plugins:

Настроим работу с изображениями и шрифтами

Добавим правило поиска файлов с определёнными расширениями:

{
test: /\.(png|svg|jpg|gif|woff(2)?|eot|ttf|otf)$/,
type: 'asset/resource'
}

Настроим обработку CSS

Для обработки CSS нужны два пакета:

npm i css-loader --save-dev
npm i mini-css-extract-plugin --save-dev

Подключим к проекту mini-css-extract-plugin:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

Затем добавьте правило для обработки css-файлов:

{ // применять это правило только к CSS-файлам
test: /\.css$/,
// при обработке этих файлов нужно использовать
// MiniCssExtractPlugin.loader и css-loader
use: [ MiniCssExtractPlugin.loader, {
loader: 'css-loader'
}]
}

Добавим в массив plugins вызов MiniCssExtractPlugin с ключевым словом new.

Установим PostCSS и два плагина для минификации CSS:

npm i postcss-loader --save-dev
npm i autoprefixer --save-dev
npm i cssnano --save-dev

Настроим PostCSS

Создадим в корне проекта файл postcss.config.js:

Если вы используете директиву @import в css-файлах, после подключения postcss-loader, нужно изменить то, как подключается css-loader.

В конце css-loader необходимо передать опцию importLoaders со значением 1: