Get In Touch
admin@victoriaweb.me
Back

Основи збірки Frontend проектів на Webpack

Webpack на даний момент (2024) одним з найпопулярніших збірників проектів разом з Vite. В статті покроково і детально розписано, як зібрати просту посадочну сторінку, використовуючи webpack. Як приклад я роблю просту посадкову сторінку (лендінг) на якій сама практикувалась.

webpack logo

Крок 1 – установка Node.js

Найперше що потрібно мати встановленим – це Node.js та Node Package Manager (npm) – вони обидва встановлюються за раз за цим посиланням https://nodejs.org/en/download/prebuilt-installer/current. При завантаженні можна вибрати потрібні параметри – операційну систему, розрядність і т.п. В даному випадку посилання на Prebuilt Installer.

Щоб перевірити чи установка пройшла правильно, є дві команди для командного рядка, їх вводим по черзі:

node -v 
npm -v

Перша має показати яка версія node.js встановлена на комп`ютері, друга – версію npm.

Крок 2 – створення структури проекту

Загальноприйнята структура проекту – це папка src для розробки, яка містить всі файли проекту з якими ми працюєм (html, css, images, js, і т. п.) . Готовий проект (збірка) поміщається в папку dist (створюється автоматично коли запускається перший раз команда збірки). Ці дві папки містяться в основній папці (директорії) проекту, яка в свою чергу названа по правилам описаним нижче.

Отже для посадочної сторінки (односторінкового сайту) створюєм папку з назвою проекту – ModernLandingPage наприклад. Найкраще називати папки без пробілів, щоб в подальшому нічого не перейменовувати, якщо буде треба працювати з Git. Для того, щоб працювати з папками в Git та збірниках проектів (наприклад, у IDE), важливо дотримуватись певних правил неймінгу папок. Це допоможе уникнути помилок і забезпечити сумісність між різними системами. Ось кілька рекомендацій як правильно називати папки:

1. Використання дозволених символів

Використовуйте лише букви (латиниця), цифри, дефіси (-), та підкреслення (_). Уникайте використання пробілів та спеціальних символів (наприклад, @, #, !, %, тощо). Використовуйте пробіли замінюючи їх дефісами або підкресленням, наприклад, my-project або my_project.

2. Реєстр символів

Найкраще використовувати нижній регістр для неймінгу, щоб уникнути плутанини в різних операційних системах, які можуть бути чутливими до регістру (наприклад, Linux відрізняє Folder і folder).

3. Довжина імен

Уникайте дуже довгих імен файлів і папок. Короткі та описові імена краще підходять для зручності роботи. Максимальна довжина шляху до файлу або папки (включаючи всі підпапки) може бути обмежена системою; наприклад, Windows має обмеження в 260 символів.

4. Використання значущих імен

Використовуйте імена, які логічно відображають вміст або призначення папки. Це допоможе вам та іншим розробникам легше орієнтуватися у проекті.

5. Уникання зарезервованих слів

Уникайте використання зарезервованих слів операційних систем або Git (наприклад, CON, PRN, AUX, NUL в Windows).

6. Уникання різних кодувань

Використовуйте UTF-8 для назв файлів та папок, щоб забезпечити максимальну сумісність.

7. Особливості роботи з Git

Git працює краще з ASCII-символами, тому краще уникати не-ASCII символів (наприклад, кириличних символів), щоб уникнути потенційних проблем з різними системами або при колаборації з іншими розробниками.

Приклади правильних назв папок:

  1. my_project
  2. src
  3. test-files
  4. config
  5. backup_2024
  6. docs
  7. scripts
  8. assets
  9. lib_v1
  10. user-data

Приклади не правильних назв папок:

  1. My Project (пробіл між словами)
  2. src#1 (спеціальний символ #)
  3. test/files (знак / використовується як розділювач в шляху)
  4. con (зарезервоване слово в Windows)
  5. backup@2024 (спеціальний символ @)
  6. Документи (некоректне використання кирилиці)
  7. scripts! (спеціальний символ !)
  8. assets% (спеціальний символ %)
  9. lib\v1 (знак \ використовується як розділювач в шляху)
  10. user:data (двоокрапка : є спеціальним символом у багатьох ОС

Крок 3 – створення нового проекту

Після того як ми створили основну директорію проекту, переходим в неї з командного рядка:

npm init -y

Ця команда створить файл package.json де будуть зберігатись налаштування проекту

Чи потрібно встановлювати Webpack глобально і локально?


Глобальна установка Webpack (необов’язкова і рідко потрібна):

Глобальна установка встановлює Webpack на ваш комп’ютер таким чином, що він доступний з командного рядка з будь-якої директорії.

npm install -g webpack webpack-cli

Коли це потрібно?

Глобальну установку можуть використовувати розробники, якщо вони часто створюють проекти і хочуть мати швидкий доступ до команд Webpack.
Мінуси: Використання глобально встановлених пакетів може призвести до проблем з версіями, особливо якщо в різних проектах потрібні різні версії Webpack. Це може спричинити проблеми з сумісністю.

Крок 4 – Локальна установка

npm install webpack webpack-cli --save-dev

Встановлює Webpack в директорію проекту. Зазвичай, це найкраща практика, оскільки:

  • Це забезпечує, що конкретний проект використовує конкретну версію Webpack, необхідну для цього проекту.
  • Це дозволяє іншим розробникам, які працюють з вашим проектом, мати ті ж самі версії залежностей без необхідності встановлювати їх глобально.


Детальні пояснення інших варіантів команд для установки Webpack

npm install webnpm install webpack webpack-cli --save-dev

Ця команда встановлює як webpack, так і webpack-cli як залежності для розробки (development dependencies). Рекомендується використовувати саме цю команду при встановленні Webpack локально в проекті.

npm install --save-dev webpack

Ця команда встановлює лише webpack як залежність для розробки. Не встановлює webpack-cli, який також потрібен для роботи з Webpack через командний рядок. Щоб використовувати Webpack з командного рядка, вам необхідно додатково встановити webpack-cli. Команду можна доповнити: npm install --save-dev webpack webpack-cli.

npm install webpack webpack-cli

Ця команда встановлює webpack та webpack-cli як залежності, але за замовчуванням у секції "dependencies" (продакшн залежності) у файлі package.json. Рекомендується використовувати --save-dev, оскільки Webpack зазвичай використовується тільки на етапі розробки, а не у продакшені.

Отже в нашому випадку встановлюєм Webpack локально використовуючи команду:

npm install webpack webpack-cli --save-dev

Це гарантує, що всі залежності (і webpack, і webpack-cli) встановлені для розробки і не створюють проблем з сумісністю між проектами, тобто:

–save-dev: Вказує, що залежність потрібна тільки під час розробки, і додає її до “devDependencies”.
Без –save-dev: Вказує, що залежність потрібна як під час розробки, так і у продакшені, і додає її до “dependencies”.

Крок 5 – налаштування Webpack для збірки вашого проекту

Досить стандартий проект – стилі написані на scss, які плагін MiniCssExtractPlugin перетворює на css і додає в папку dist. Плагін CopyWebpackPlugin переносить файл reset.css з папки src в папку dist, не змінюючи його.

У головній директорії проекту створюєй файл webpack.config.js вручну або через командний рядок:

touch webpack.config.js

Цей файл буде містити всі налаштування Webpack для вашого проекту:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: '/',
  },
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
        ],
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'images/[name][ext]',
        },
      },
    ],
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
    new MiniCssExtractPlugin({
      filename: 'css/[name].css',
    }),
    new CopyWebpackPlugin({
      patterns: [
        { from: 'src/images', to: 'images' },
        { from: 'src/css/reset.css', to: 'css/reset.css' },
      ],
    }),
  ],
  devServer: {
    static: {
      directory: path.join(__dirname, 'dist'),
    },
    compress: true,
    port: 9000,
    open: true,
    hot: true,
    devMiddleware: {
      writeToDisk: true,
    },
  },
  mode: 'development',
};

Пояснення коніфгурації:

const path = require('path');
  • Опис: Підключає модуль Node.js під назвою path, який надає утиліти для роботи з шляхами файлів і директорій.
  • Призначення: Використовується для формування абсолютних шляхів до файлів і папок на вашій файловій системі, щоб уникнути помилок під час вказання відносних шляхів.
const HtmlWebpackPlugin = require('html-webpack-plugin');
  • Опис: Підключає плагін html-webpack-plugin для Webpack.
  • Призначення: Цей плагін автоматично створює HTML-файл у вашій директорії збірки (dist), додає до нього всі скомпільовані скрипти та стилі. Він допомагає автоматизувати процес підключення файлів JavaScript та CSS у ваш HTML-файл.
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  • Опис: Підключає плагін clean-webpack-plugin.
  • Призначення: Цей плагін очищає (видаляє) всі файли в директорії збірки (dist) перед кожною новою збіркою, щоб уникнути збереження застарілих або невикористовуваних файлів.
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  • Опис: Підключає плагін mini-css-extract-plugin.
  • Призначення: Цей плагін витягує CSS з ваших JavaScript модулів та зберігає їх у окремі CSS-файли. Це покращує продуктивність сайту, оскільки стилі завантажуються окремо від скриптів.
const CopyWebpackPlugin = require('copy-webpack-plugin');
  • Опис: Підключає плагін copy-webpack-plugin.
  • Призначення: Цей плагін копіює файли або цілі папки з директорії src в директорію dist (або іншу папку збірки), зберігаючи їх структуру. Він корисний для копіювання статичних файлів, які не потребують обробки Webpack, наприклад, зображень або файлів CSS, які використовуються як ресет стилів.

Пояснення кожного ключа у конфігурації

Частина коду module.exports = { ... }; є об’єктом, який експортується як конфігурація Webpack. Цей об’єкт містить усі налаштування, які Webpack використовує для процесу збірки нашого проекту. Давайте розглянемо кожен ключ в цьому об’єкті і пояснимо його призначення.

entry: './src/index.js',
  • Опис: Підключає плагін copy-webpack-plugin.
  • Призначення: Цей плагін копіює файли або цілі папки з директорії src в директорію dist (або іншу папку збірки), зберігаючи їх структуру. Він корисний для копіювання статичних файлів, які не потребують обробки Webpack, наприклад, зображень або файлів CSS, які використовуються як ресет стилів.
output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist'),
  publicPath: '/',
},
  • Опис: Вказує, куди Webpack повинен зберегти вихідні файли.
  • filename: Ім’я вихідного файлу (або файлів), що буде згенерований після збірки. У цьому випадку, це bundle.js.
  • path: Абсолютний шлях до директорії, куди будуть збережені зібрані файли. path.resolve(__dirname, 'dist') використовує модуль path для отримання абсолютного шляху до папки dist.
  • publicPath: Базовий шлях для всіх ресурсів у вашому проекті (наприклад, зображення, шрифти тощо). В даному випадку це коренева директорія (/).
module: {
  rules: [
    {
      test: /\.scss$/,
      use: [
        MiniCssExtractPlugin.loader,
        'css-loader',
        'sass-loader',
      ],
    },
    {
      test: /\.css$/,
      use: [
        MiniCssExtractPlugin.loader,
        'css-loader',
      ],
    },
    {
      test: /\.(png|svg|jpg|jpeg|gif)$/i,
      type: 'asset/resource',
      generator: {
        filename: 'images/[name][ext]',
      },
    },
  ],
},

Опис: Налаштовує, як різні типи файлів (JavaScript, CSS, зображення тощо) повинні оброблятися під час процесу збірки.rules: Масив правил, де кожне правило вказує, як обробляти певний тип файлів.

  • Кожне правило (rule) містить:
    • test: Регулярний вираз (RegExp), який визначає тип файлів, до яких застосовується правило. Наприклад, /\.scss$/ відповідає всім файлам, що закінчуються на .scss.
    • use: Масив лоадерів (loaders), які будуть застосовані до файлів, що відповідають test.
      • MiniCssExtractPlugin.loader: Витягує CSS у окремі файли.
      • css-loader: Обробляє CSS-файли і додає їх в JavaScript.
      • sass-loader: Компілює SCSS у CSS.
    • type: Тип обробки файлів. asset/resource обробляє файли як ресурси (копіює їх у вихідну директорію).
    • generator: Дозволяє налаштувати ім’я і шлях для згенерованих файлів. У прикладі зображення зберігатимуться в папці images у вихідній директорії.
plugins: [
  new CleanWebpackPlugin(),
  new HtmlWebpackPlugin({
    template: './src/index.html',
  }),
  new MiniCssExtractPlugin({
    filename: 'css/[name].css',
  }),
  new CopyWebpackPlugin({
    patterns: [
      { from: 'src/images', to: 'images' },
      { from: 'src/css/reset.css', to: 'css/reset.css' },
    ],
  }),
],
  • Опис: Масив плагінів, які додають додаткову функціональність до процесу збірки.CleanWebpackPlugin: Очищає вихідну директорію (dist) перед новою збіркою.
  • HtmlWebpackPlugin: Автоматично генерує HTML-файл і додає до нього всі зібрані скрипти та стилі.
  • MiniCssExtractPlugin: Витягує CSS у окремі файли і зберігає їх у папці css.
  • CopyWebpackPlugin: Копіює файли або папки з src до dist без зміни.
devServer: {
  static: {
    directory: path.join(__dirname, 'dist'),
  },
  compress: true,
  port: 9000,
  open: true,
  hot: true,
  devMiddleware: {
    writeToDisk: true,
  },
},
  • Опис: Налаштування для локального серверу розробки Webpack DevServer, який полегшує процес розробки.
  • static: Вказує каталог для обслуговування статичних файлів (в даному випадку, dist).
  • compress: Вмикає стиснення gzip для зменшення розміру відповіді і підвищення швидкості завантаження.
  • port: Вказує порт, на якому працює сервер (9000).
  • open: Автоматично відкриває браузер після запуску сервера.
  • hot: Вмикає гаряче перезавантаження модулів (HMR), що дозволяє автоматично оновлювати змінені модулі без перезавантаження всієї сторінки.
  • devMiddleware: Додаткові налаштування для проміжного програмного забезпечення.
  • writeToDisk: Дозволяє записувати файли на диск, корисно для відладки.
mode: 'development',
  • Опис: Визначає режим роботи Webpack.
  • Призначення: mode може бути 'development' або 'production'. У режимі розробки (development) Webpack генерує незжаті файли з вихідними картами (source maps) для полегшення налагодження. У режимі продакшену (production) Webpack оптимізує і зменшує розмір файлів для швидшого завантаження.

Крок 6 – встановлення залежностей

Встановіть всі необхідні залежності, які ви використовуєте у своєму конфігураційному файлі Webpack, такі як Webpack, плагіни, і лоадери:

npm install --save-dev webpack webpack-cli webpack-dev-server
npm install --save-dev html-webpack-plugin clean-webpack-plugin mini-css-extract-plugin copy-webpack-plugin
npm install --save-dev css-loader sass-loader style-loader
npm install --save-dev @babel/core @babel/preset-env babel-loader

Тут ми встановлюємо:

  • Webpack і webpack-cli: основні пакети для роботи Webpack.
  • webpack-dev-server: для роботи локального сервера розробки.
  • html-webpack-plugin, clean-webpack-plugin, mini-css-extract-plugin, copy-webpack-plugin: плагіни, які використовуються в конфігурації.
  • css-loader, sass-loader, style-loader: лоадери для обробки CSS і SCSS файлів.
  • babel-loader, @babel/core, @babel/preset-env: для транспіляції сучасного JavaScript в більш сумісний код.

Крок 7 – перевіряєм чи є всі потрібні файли у проекті

Створіть структуру директорій і файлів для вашого проекту, якщо вони ще не створені, наприклад:

mkdir src
touch src/index.js
touch src/index.html
mkdir src/css
touch src/css/styles.scss
mkdir src/images
  • src/: Директорія вихідних файлів вашого проекту.
  • src/index.js: Головний JavaScript файл вашого додатку (вхідна точка).
  • src/index.html: HTML файл шаблону для HtmlWebpackPlugin.
  • src/css/styles.scss: SCSS файл для стилів.
  • src/images: Директорія для зберігання зображень.

Дуже важливо правильно розставити файли по папкам щоб у конфігураційному файлі всі шляхи прали правильно, інакше – проект просто не збереться.

Якщо проект містить Javascript, то потрібне налаштування Babel

Якщо ви плануєте використовувати сучасний JavaScript (ES6+), вам потрібно налаштувати Babel. Створіть файл .babelrc у корені проекту:

{
  "presets": ["@babel/preset-env"]
}

Це дозволить Babel транспілювати сучасний JavaScript у сумісний з більшістю браузерів код.

Крок 8 – налаштування npm скриптів

В package.json додайте скрипти для запуску Webpack у режимі розробки або продакшену:

 "scripts": {
    "clean": "rm -rf dist",
    "build": "webpack --mode production",
    "start": "webpack serve --mode development"
  },

Крок 9 – команди керування збіркою

Розробка проекту

Після налаштування всього середовища ви можете почати розробку. Використовуйте команду npm start для запуску локального сервера розробки:

npm start

Webpack DevServer запустить сервер, збиратиме проект в пам’яті і відкриватиме ваш браузер для попереднього перегляду. Всі зміни в ваших файлах (наприклад, JavaScript або SCSS) будуть автоматично відображатися в браузері завдяки гарячому перезавантаженню (Hot Module Replacement, HMR).

Збірка для продакшену

Коли проект буде готовий до розгортання, ви можете зібрати його у режимі продакшену. Використовуйте команду:

npm run build

Ця команда згенерує оптимізовані файли у директорії dist (або іншій директорії збірки), які можна розгортати на сервері.

Перевірка та оптимізація

Перевірте проект після збірки, щоб переконатися, що всі ресурси правильно підключені і працюють.Оптимізуйте кінцеві файли, якщо необхідно (наприклад, зменшення розмірів зображень або файлів JavaScript).

Крок 10 – Розгортання проекту

Після завершення розробки і тестування згенерований проект можна розгорнути на будь-якому веб-сервері або хостинговій платформі. Копіюйте всі файли з папки dist на ваш сервер або використовуйте інші засоби розгортання, такі як FTP, Git, CI/CD тощо.

Підсумок

Після налаштування конфігураційного файлу Webpack, наступними кроками є ініціалізація проекту, встановлення залежностей, створення необхідних файлів і директорій, налаштування Babel (якщо потрібно), налаштування npm скриптів, запуск проекту в режимі розробки, збірка для продакшену, перевірка, оптимізація та розгортання проекту на сервері.

Офіційна документація Webpack https://webpack.js.org/guides/getting-started/#basic-setup

Victoriia Hladka
Victoriia Hladka
https://victoriaweb.me