nmk

Лекція №3 (2 години). Середовище розробки та сучасний інструментарій (Tooling)

План лекції

  1. Екосистема Node.js у фронтенді: Фундаментальний зсув парадигми розробки
  2. Менеджери пакетів: npm, yarn, pnpm — боротьба за ефективність та детермінованість
  3. Еволюція систем збірки: Від монолітного Webpack до реактивного Vite
  4. Транспайлери: Перетворення ідей у сумісний код
  5. Практична конфігурація та екосистема якості

Перелік умовних скорочень

Вступ

Ще 10-15 років тому розробнику було достатньо відкрити “Блокнот”, написати HTML, підключити файл script.js і відкрити його в браузері. Сьогодні розробка React-додатку вимагає запуску складного конвеєра інструментів (Tooling pipeline). Ми навряд чи можемо прямо виконати JSX-код або сучасний TypeScript у браузері без попередньої трансформації. Ця лекція детально аналізує, з чого складається сучасне середовище веб-інженера (Development Environment), як інструменти взаємодіють між собою і чому Vite прийшов на зміну класичному Webpack.

1. Екосистема Node.js у фронтенді: Фундаментальний зсув парадигми розробки

1.1. Node.js як середовище виконання інструментів (Runtime)

Першою великою помилкою початківців є думка, що оскільки ми створюємо фронтенд, нам потрібен лише браузер. Node.js — це середовище виконання (runtime) мови JavaScript поза браузером (на сервері або на вашому комп’ютері). У фронтенд-розробці ми використовуємо Node.js виключно для запуску скриптів-помічників: збірки проекту, компіляції SASS в CSS, перевірки якості коду (лінтери) або запуску локального Dev-сервера. Весь ваш React-код розробляється та тестується інструментами, які живуть в екосистемі Node.js.

1.2. Анатомія та стратегічне значення package.json

Починаючи з першого дня створення проекту npm init або ініціалізації Vite, у корені проекту лежить package.json. Це “паспорт” проекту:

1.3. Semantic Versioning (SemVer): Контракт надійності екосистеми

Пакети оновлюються постійно. Для збереження стабільності проекти використовують специфікацію SemVer формату MAJOR.MINOR.PATCH:

Знак каретки ^ у package.json (напр. ^18.2.0) дозволяє автооновити версію до мінорних та патчів, але блокує мажорні зміни, щоб не зламати додаток.


2. Менеджери пакетів: npm, yarn, pnpm — боротьба за ефективність та детермінованість

2.1. npm (Node Package Manager)

Найперший і вбудований у Node.js стандарт. У ранніх версіях страждав від “Node Modules Black Hole” (чорна діра) — папка node_modules розросталася до гігабайтів, бо кожен пакет стягував свою ізольовану версію залежностей, дублюючи їх. Версія 5 вирішила проблеми надійності впровадивши package-lock.json — файл, який гарантує детермінізм (кожен розробник команди гарантовано завантажить до байту однакові версії).

2.2. Yarn (від Facebook)

У 2016 році, незадоволені швидкістю та безпекою npm, інженери FB випустили Yarn. Він вперше впровадив паралельне завантаження, офлайн-кеш та концепцію yarn.lock. Yarn суттєво прискорив CI/CD (збірку проекту на серверах) і змусив npm еволюціонувати.

2.3. pnpm (Performant npm)

Сучасний стандарт ефективності на 2024-2025 роки. На відміну від ‘лінійної’ папки (hoisting) npm та Yarn, pnpm використовує концепцію “жорстких посилань” (symlinks) операційної системи. Якщо ви створите 10 React-проектів через npm, у вас на диску буде лежати 10 копій бібліотеки React (в папках node_modules). pnpm тримає бібліотеку React в унікальному загальному сховищі (store) і створює 10 посилань. Результат: блискавична швидкість встановлення (до 3 разів швидше) і економія сотень гігабайтів дискового простору.


3. Еволюція систем збірки: Від монолітного Webpack до реактивного Vite

Браузер (зазвичай) не вміє використовувати import React from 'react'. Він також не знає що таке SASS модулів і JSX. Тож вам потрібен Bundler (Збирач).

3.1. Епоха Webpack та “жадібного” бандлінгу (Create React App)

Webpack, серце класичного інструменту create-react-app (CRA), збирав код “жадібно” (Bundle-based). Коли ви викликали npm start, Webpack мусив проаналізувати КОЖЕН ФАЙЛ вашого проекту, пропустити його через плагіни (Babel, PostCSS), з’єднати в один великий файл bundle.js і лише потім віддати браузеру. Для великих додатків час очікування Dev-сервера міг досягати 1–5 хвилин!

3.2. Vite: Архітектура на основі нативних ES-модулів (ESM)

Сучасні браузери (Google Chrome, Firefox) навчилися нативно розуміти ECMAScript Modules (<script type="module">). Vite (створений Еваном Ю) змінив парадигму (Native ESM-based):

  1. Швидкий старт (Zero-Bundle): Vite взагалі НЕ збирає ваш код під час розробки! Dev-сервер стартує миттєво (за 100-300 мілісекунд).
  2. On-Demand (За запитом): Коли браузер робить запит переглянути файл App.jsx, Vite перетворює цей і тільки цей файл на льоту і віддає його браузеру як ESM-модуль.
  3. Блискавичний HMR: (Hot Module Replacement — заміна модуля “гарячою”). Якщо ви змінили колір кнопки, Vite поновлює лише модуль цієї кнопки у браузері, зберігаючи стан вашої форми недоторканим.

(Примітка: На етапі виробництва або команди npm run build, Vite також збирає код через швидкий збирач Rollup, щоб створити найоптимальніші бандли для продакшену).


4. Транспайлери: Перетворення ідей у сумісний код

Транспайлер (Source-to-Source компілятор) переписує код високого рівня з однієї версії синтаксису в іншу.

4.1. Babel

Багаторічний лідер індустрії. Babel бере ваш код написаний на останніх стандартах JavaScript (ES2024, JSX, TypeScript), аналізує його (будує Абстрактне Синтаксичне Дерево - AST) і “деградує” (переписує) назад на старий ES5 (зрозумілий всім браузерам). Babel написаний на JavaScript, тому страждав на продуктивність у дуже великих проектах.

4.2. SWC (Speedy Web Compiler)

Новий гравець, що поступово витісняє Babel. SWC написаний на мові системного програмування Rust. Завдяки особливостям управління пам’яттю та багатопотоковості Rust, SWC компілює код у 20-40 разів швидше, ніж Babel. Сучасний Vite за замовчуванням пропонує плагіни саме на базі SWC (@vitejs/plugin-react-swc).


5. Практична конфігурація та екосистема якості

Сліпе написання коду призводить до хаосу в архітектурі, коли над проектом починають працювати більше ніж 2 людини.

5.1. Лінтери та форматери

Приклад налаштування package.json:

// Виклик цих команд гарантує чистоту коду
"scripts": {
  "lint": "eslint src --ext js,jsx",
  "format": "prettier --write \"src/**/*.{js,jsx,css}\""
}

5.2. Автоматизація з Git Hooks: Husky та lint-staged

Щоб гарантувати, що “брудний” код взагалі ніколи не потрапить у загальний репозиторій (Git), використовують інтеграцію (Git Hooks) за допомогою інструменту Husky. При виконанні команди git commit -m "update", автоматично тригериться “pre-commit” хук. Інструмент lint-staged перевіряє лише ті файли, які змінені. Якщо в них є помилки ESLint — коміт блокується. Це створює надійну дисципліну серед розробників (Continuous Quality).

Висновки

  1. Сучасна розробка React-додатку — це індустрія, побудована поверх потужних конвеєрних інструментів, управління якими працює в середовищі Node.js.
  2. package.json — є центром екосистеми, фіксуючи наявність зовнішніх бібліотек із жорстким контролем версіонування (SemVer) через lock-файли (pnpm-lock).
  3. Зміна парадигми від Webpack (Bundler Architecture) до Vite (ESM Architecture) скоротила процеси (запуск середовища, HMR) з декількох хвилин до частки секунд, радикально вплинувши на Developer Experience.
  4. Транспайлери такі як SWC та лінтери ESLint забезпечують міст між майбутнім експериментальним синтаксом JavaScript (та React) та стабільними, безпечними версіями, що працюватимуть на пристроях звичайних споживачів веб-публікацій.

Джерела

  1. Node.js Documentation. URL: https://nodejs.org/en/docs/
  2. Semantic Versioning Specification (SemVer). URL: https://semver.org/
  3. npm Documentation: package.json. URL: https://docs.npmjs.com/cli/v10/configuring-npm/package-json
  4. Vite Official Documentation. “Why Vite?”. URL: https://vitejs.dev/guide/why.html
  5. You, Evan. “Building a faster web with Vite”. VueConf.
  6. Webpack Documentation: Concepts. URL: https://webpack.js.org/concepts/
  7. pnpm Documentation. “Motivation”. URL: https://pnpm.io/motivation
  8. SWC: Speedy Web Compiler. URL: https://swc.rs/
  9. Babel - The compiler for next generation JavaScript. URL: https://babeljs.io/
  10. ESLint - Pluggable JavaScript linter. URL: https://eslint.org/
  11. Prettier - Opinionated Code Formatter. URL: https://prettier.io/
  12. “Husky: Git Hooks made easy”. URL: https://typicode.github.io/husky/
  13. Lint-staged GitHub repository.
  14. JavaScript Modules (ESM) MDN Guide. URL: https://developer.mozilla.org/

Запитання для самоперевірки

  1. Звідки береться потреба у Node.js під час написання фронтенд-коду (React), якщо наш фінальний застосунок виконується виключно в інтернет-браузері користувача?
  2. Поясніть принципову різницю “Семантичного керування версіями” (SemVer). Які зміни принесе оновлення пакету від версії 2.4.1 до 3.0.0?
  3. В чому ключова архітектурна різниця між підсумками підготовки dev-середовища через Webpack (напр., Create React App) та Vite? Як ця різниця впливає на тривалість запуску?
  4. Чому інструмент pnpm вважається більш ефективним порівняно зі звичайним npm щодо використання жорсткого диску та швидкості установки?
  5. Назвіть концептуальну відмінність між завданнями, які вирішує ESLint, та завданнями, якими керується Prettier.