April 11, 2020

Webpack: сборка JS-модулей

Всем привет! Как и обещали, выпускаем небольшую вводную статью по сборке JS-проекта с помощью Webpack.

Что такое Webpack

Если кратко, то это сборщик проектов, который занимается различными оптимизационными для загрузки работами (в частности - минимизацией кода, то есть удалением из него всех пробелов, заменой длинных имён переменных на более короткие и так далее). Однако помимо очень важной для пользователя уменьшенного времени загрузки скрипта, он предоставляет разработчику более более приятный опыт написания кода.

Пример удобства Webpack

Создадим простой проект с незамысловатой структурой.

Допустим, мы хотим создать класс Card, который будет иметь некоторые поля и пару удобных методов, а далее мы будем использовать его в main.js . Безусловно, создадим мы файл с этим классом в папке js .

Ниже представлено то, как выглядит этот файл:

Вот так выглядит index.html:

Содержимое файла main.js:

В index.css пропишем следующие стили:

Вся логика достаточно проста: мы создаём экземпляр класса Card, получаем его HTML-представление и вставляем его в документ, к которому будет подключен скрипт. Тут и начинаются первые проблемы. Если мы подключим файлы так, как показано ниже, то произойдёт ошибка.

Так выглядит само сообщение об ошибке:

Ошибка заключается в том, что класс Card, который мы используем в файле main.js, находится в файле card.js, который мы добавляем в тэге script позже. Собственно из-за того, что мы используем ещё не определённый класс Card в main.js и происходит ошибка. Если мы поменяем местами импорты этих файлов, то всё заработает.

А теперь просто вдумайтесь, насколько же трудно было бы следить за порядком файлов в реальном проекте, даже представить трудно, не так ли?

Теперь посмотрим, как Webpack подходит к процессу сборки JS-проектов.

Для начала, необходимо проинициализировать node package manager в корневой директории проекта. Для этого достаточно ввести следующую команду в командной строке npm init -y.

Далее необходимо ввести такую команду: npm i webpack webpack-cli -D . Отлично, у нас всё готово для продолжения работы.

Теперь необходимо создать файл-конфигурацию для Webpack, создать её нужно также в корневой директории проекта. ВАЖНО!!! Он обязательно должен иметь название webpack.config.js . Ниже можете видеть его содержимое, сейчас мы кратко пройдёмся по тому, за что отвечает каждый ключ в объекте конфигурации.

Во-первых, path – модуль из среды исполнения JS на сервере, Node.js. Он нужен для работы с файловой системой. Ключ entry , как можно догадаться по названию, обозначает путь до входного файла, то есть до файла, с которого Webpack начнёт сборку проекта.

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

Посмотрим, как нам теперь нужно модифицировать наши JS-файлы, чтобы это всё отлично работало со сборщиком.

Добавились какие-то странные ключевые слова import и export , заметили? Они пришли к нам вместе с возможностью сборки наших JS-файлов в один финальный бандл. Ключевое слово export даёт возможность использовать нам переменную или функцию в другом файле.

Что же нам нужно, чтобы использовать их в другом файле? Нам нужно импортировать то, что мы хотим, в этот файл с помощью ключевого слова import. По умолчанию, из каждого экспорта какого-либо файла создаётся объект, где каждому ключу соответствует название переменной или функции, экспортируемой с помощью ключевого слова export.

Далее создадим новый npm-скрипт в файле package.json.

Отлично, сделав все эти шаги, необходимо ввести в терминал команду npm run build.

После выполнения этой команды в корне проекта должна была быть создана папка distributive, в которой находится файл main.js .

В index.html нужно прописать в тэге скрипт путь до бандла, который нам построил Webpack.

Теперь открываем наш файл в браузере и УРА, всё работает!

Резюмируя это всё, мы только что поняли, каким образом работает Webpack, увидели разницу между двумя подходами и осознали, насколько же удобен и лёгок для применения Webpack.


Статья подготовлена образовательной организацией JavaScript Academy