nmk

Лекція №1 (2 години). Еволюція веб-технологій та місце React у сучасній розробці

План лекції

  1. Від статичного гіпертексту до динамічних систем
  2. Виклики управління складністю та технічна криза MVC
  3. Історія створення React: Від внутрішнього прототипу до глобального стандарту
  4. Декларативність проти імперативності
  5. React як бібліотека: Роль рівня представлення (View Layer)
  6. Механізми роботи: Virtual DOM та Reconciliation
  7. Сучасне середовище розробки та інструментарій (Tooling)
  8. JSX: Синтаксис, обмеження та трансляція
  9. Професійні стандарти та етика у 2024–2025 роках

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

Вступ

Для глибокого розуміння React недостатньо знати лише його API та синтаксис. Професійний розробник має розуміти, яку саме проблему вирішує цей інструмент, чому він з’явився та як його архітектура докорінно змінила підхід до створення користувацьких інтерфейсів (UI). Ця лекція присвячена еволюції веб-розробки та фундаментальним парадигмам, на яких базується React.


1. Від статичного гіпертексту до динамічних систем

На початку свого існування Web (Web 1.0) був набором статичних HTML-документів, з’єднаних гіперпосиланнями. Роль JavaScript обмежувалася вкрай простими завданнями (перевірка форм, базові анімації).

З появою Web 2.0 та технології AJAX (Asynchronous JavaScript and XML), веб-сторінки навчилися оновлювати дані без повного перезавантаження браузера. Це стало початком ери динамічних систем.

Проблема прямої маніпуляції DOM

Довгий час стандартом де-факто для роботи з DOM була бібліотека jQuery. Вона вирішувала проблеми кросбраузерності та спрощувала доступ до елементів сторінки.

Приклад jQuery (Пряма маніпуляція):

// Знайти елемент і додати обробник подій
$("#add-btn").on("click", function () {
  // Прочитати значення з інпуту
  const text = $("#todo-input").val();
  // Створити новий HTML-елемент та вставити його в DOM
  $("#todo-list").append("<li>" + text + "</li>");
  // Очистити інпут
  $("#todo-input").val("");
});

Цей підхід працював добре для простих сайтів. Але коли сторінка перетворилася на повноцінний додаток (SPA - Single Page Application) із сотнями інтерактивних елементів, ручна зміна DOM стала джерелом хаосу. Стан додатку (дані) був “розмазаний” по самому DOM-дереву.


2. Виклики управління складністю та технічна криза MVC

Коли jQuery перестав справлятися зі складністю, з’явилися перші повноцінні фронтенд-фреймворки на базі патерна MVC (Model-View-Controller) або його варіацій (MVVM): Backbone.js, AngularJS, Ember.js.

Вони розділили дані (Модель) та інтерфейс (Вигляд). Коли Модель змінювалась, Вигляд мав оновитися. Проте у складних інтерфейсах (наприклад, Facebook) виникла проблема “каскадних оновлень”. Зміна однієї моделі викликала зміну іншої, що провокувало множинні та непередбачувані оновлення DOM. Знайти причину багу, коли непрочитане повідомлення світилося в одному місці та зникало в іншому, ставало майже неможливо.


3. Історія створення React: Від внутрішнього прототипу до глобального стандарту

В 2011 році команда Facebook (на чолі з Jordan Walke) зіткнулася з проблемою масштабування свого рекламного кабінету та системи сповіщень. Вони вирішили зламати усталені правила (зокрема міф про те, що HTML та JavaScript мають бути фізично розділені в різних файлах) і створили бібліотеку FaxJS (попередник React).

У 2013 році React став Open Source. Спочатку спільнота сприйняла його вкрай скептично: ідея писати HTML всередині JavaScript (через JSX) виглядала як крок назад і “порушення принципу розділення відповідальності” (Separation of Concerns). Але React довів, що відділяти треба не технології (окремо CSS, HTML, JS), а компоненти логіки.

Сьогодні React — це глобальний індустріальний стандарт, на якому працюють Airbnb, Netflix, Instagram та мільйони інших проектів.


4. Декларативність проти імперативності

Найголовніший зсув парадигми, який приніс React — це перехід від імперативного програмування до декларативного.

Приклад (Імперативний JS):

const btn = document.createElement("button");
btn.className = "btn-primary";
if (user.isLoggedIn) {
  btn.innerText = "Log Out";
} else {
  btn.innerText = "Log In";
}
document.getElementById("header").appendChild(btn);

Приклад (Декларативний React):

const Header = ({ user }) => (
  <header>
    <button className="btn-primary">
      {user.isLoggedIn ? "Log Out" : "Log In"}
    </button>
  </header>
);

У React розробнику більше не потрібно турбуватися про те, як саме додати або видалити кнопку з DOM при зміні стану user.isLoggedIn. React бере ці турботи на себе. Розробник лише відображає дані у UI: UI = f(state).


5. React як бібліотека: Роль рівня представлення (View Layer)

React позиціонує себе саме як бібліотека для створення користувацьких інтерфейсів, а не фреймворк (як Angular або Vue). У класичному розумінні патерну MVC, React є лише літерою “V” (View — Вигляд).

Він “з коробки” не знає, як робити HTTP-запити до сервера (як Axios), як будувати багатосторінкову навігацію (як React Router), або як керувати складним глобальним станом додатку (як Redux або Zustand). Ця композитність є головною силою React: вона дає повну свободу архітектору підібрати саме той набір інструментів, який найкраще вирішує бізнес-задачу конкретного проекту.


6. Механізми роботи: Virtual DOM та Reconciliation

(Детально розглядатиметься в Лекції 2)

Чому пряма маніпуляція DOM вважається поганою практикою? Тому що DOM — це дуже “важкий” та повільний API браузера. Щоб забезпечити декларативний підхід, не перезавантажуючи сторінку повністю при кожній зміні даних, React впровадив концепцію Virtual DOM.

Virtual DOM — це легковага In-Memory (діє в оперативній пам’яті) копія реального DOM у вигляді звичайних JavaScript об’єктів.

Як це працює концептуально:

  1. Коли дані змінюються, React генерує нове дерево Virtual DOM.
  2. Процес Reconciliation (узгодження) порівнює нове дерево з попереднім деревом Virtual DOM (алгоритм “Diffing”).
  3. React вираховує мінімальний і найефективніший набір змін, які потрібно застосувати до реального DOM браузера (проводить “патчинг”).

7. Сучасне середовище розробки та інструментарій (Tooling)

(Детально розглядатиметься в Лекції 3)

Сьогодні веб-розробник не просто підключає <script src="react.js"> до HTML. Сучасна розробка використовує складні конвеєри (Pipelines). Типовий стек включає:

Створення нового проекту сьогодні виглядає так:

npm create vite@latest my-app -- --template react

8. JSX: Синтаксис, обмеження та трансляція

(Детально розглядатиметься в Лекції 4)

JSX (JavaScript XML) — це синтаксичний цукор, що дозволяє писати деревоподібну розмітку прямо в JavaScript. Важливо розуміти, що браузер не розуміє JSX. До того, як код потрапить у браузер, транспайлер (напр. Babel) перетворює його.

JSX-код:

const element = <h1 className="greeting">Hello, world!</h1>;

Після трансляції (React 17+ / новий JSX Transform):

import { jsx as _jsx } from "react/jsx-runtime";
const element = _jsx("h1", {
  className: "greeting",
  children: "Hello, world!",
});

JSX змушує нас використовувати className замість class (адже class — зарезервоване слово в JavaScript), htmlFor замість for та використовувати camelCase для всіх обробників подій (onClick, onChange).


9. Професійні стандарти та етика у 2024–2025 роках

Сучасний React-розробник (Frontend Software Engineer) повинен орієнтуватися не лише на написання працюючого коду, але й на глобальні професійні стандарти:

  1. Доступність (Web Accessibility - a11y): Додатки мають бути доступні людям із вадами зору, слуху чи моторики. Використання семантичних HTML-тегів (<nav>, <main>, <button> замість <div> з кліками), ARIA-атрибутів та управління фокусом з клавіатури.
  2. Продуктивність (Web Vitals): Оптимізація часу першого завантаження (LCP), швидкості реакції на дії користувача (INP). Code-splitting, ліниве завантаження компонентів (React.lazy).
  3. Безпека: Розуміння XSS (Cross-Site Scripting). Хоча React автоматично екранує змінні в JSX <div>{userInput}</div>, використання атрибуту dangerouslySetInnerHTML вимагає 100% впевненості у безпеці джерела даних.
  4. Стійка архітектура: Модульність, декомпозиція бізнес-логіки та UI за допомогою Custom Hooks. Написання коду, що легко тестується. (Тести Jest, React Testing Library).

Висновки

  1. React виник як відповідь на кризу “макаронного коду” у складних інтерфейсах на базі маніпуляцій DOM.
  2. Головна перевага React — декларативність, що дозволяє описувати стан UI, а не дії над DOM-елементами.
  3. Компонентний підхід руйнує застаріле розділення технологій (HTML/CSS/JS), групуючи код за функціональними блоками додатку.
  4. React — це вузькоспеціалізована бібліотека екрану (View layer), яка є частиною великої екосистеми сучасного веб-інструментарію.

Джерела

  1. Офіційна документація React. URL: https://react.dev/
  2. MDN Web Docs. Декларативне проти імперативного. URL: https://developer.mozilla.org/
  3. Hunt C. “React: Up & Running”. O’Reilly Media, 2017.
  4. “The History of React.js on a Timeline”. URL: https://blog.risingstack.com/
  5. Osmani A. “Learning JavaScript Design Patterns”. O’Reilly Media.
  6. “Why React Frameworks are the standard”. URL: https://vercel.com/blog/
  7. Flanagan D. “JavaScript: The Definitive Guide”. O’Reilly.
  8. “A brief history of Web UI”. URL: https://ui.dev/
  9. “Introduction to Web Accessibility”. W3C. URL: https://www.w3.org/WAI/fundamentals/accessibility-intro/
  10. “Core Web Vitals”. Google Web. URL: https://web.dev/vitals/
  11. Facebook Engineering Blog: “React’s Architecture”.
  12. “From MVC to Flux to Redux”. Medium Articles.
  13. GitHub: React Repository Source Code (History).
  14. “Modern Web Tooling: Vite vs Webpack”.
  15. “ES6 and Beyond”. Kyle Simpson.
  16. “Clean Code: A Handbook of Agile Software Craftsmanship”. Robert C. Martin.
  17. “The Pragmatic Programmer”. Andrew Hunt, David Thomas.
  18. “Designing Interfaces”. Jenifer Tidwell.
  19. WCAG 2.1 Guidelines (Web Content Accessibility Guidelines).
  20. OWASP Top 10 Front-End Security Risks.

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

  1. Які проблеми прямої маніпуляції DOM (наприклад, через jQuery) вирішує React?
  2. У чому полягає фундаментальна різниця між імперативним та декларативним стилями програмування інтерфейсів?
  3. Чому React класифікується саме як бібліотека рівня View, а не повноцінний MVC-фреймворк?
  4. Що таке концепція (формула) UI = f(state) і як вона реалізується в React?
  5. Для чого потрібен процес трансляції JSX (за допомогою інструментів на кшталт Babel) перед відправкою коду в браузер?