Коротка відповідь
middleJSX — це синтаксичне розширення JavaScript, що дозволяє писати XML‑подібний код у компонентах React. Воно компілюється в виклики React.createElement, що створюють дерево елементів. JSX спрощує читання та структурування UI, зберігаючи при цьому повну контрольованість JavaScript‑логіки.
Повне пояснення
Що це і навіщо
JSX (JavaScript XML) — декларативний синтаксис, що дозволяє описувати UI‑компоненти у вигляді тегів. Він зберігає переваги JavaScript (функції, змінні, умови) і одночасно надає зручний спосіб структурування розмітки.
Ключові принципи/терміни
- JSX → синтаксичне розширення, не підтримується браузером без трансляції.
- Babel (або TypeScript) компілює JSX у
React.createElementабо відповідний API. - Теги, що починаються з великої літери, створюють користувацькі компоненти; малі — вбудовані HTML‑теги.
- Властивості передаються як об’єкт, атрибути у JSX відповідають camelCase.
Як це працює
- Під час збірки Babel/TS розбирає JSX‑текст.
- Кожен тег → виклик
React.createElement(type, props, ...children). - Результат — дерево об’єктів (Virtual DOM), яке React порівнює та оновлює реальний DOM.
Практика і реалізація
const Greeting = ({name}: {name: string}) => (
<div className="greeting">Привіт, {name}!</div>
);
ReactDOM.render(<Greeting name="Іван" />, document.getElementById('root'));
Тестування
- Unit:
@testing-library/reactрендерить компонент і перевіряє наявність тексту.
import {render, screen} from '@testing-library/react';
render(<Greeting name="Іван" />);
expect(screen.getByText(/Привіт, Іван/)).toBeInTheDocument();
- Integration: перевірка взаємодії між компонентами.
Дизайн‑рішення та моделі даних
- JSX підтримує розмітку як функціональний опис, що полегшує рефакторинг.
- Компоненти можуть бути функціональними або класовими; JSX працює з обома.
Производительность і масштабирование
- Virtual DOM мінімізує реальні оновлення, що зменшує кількість рендерів.
- Підтримка
React.memoтаuseMemoдопомагає уникнути зайвих перерахунків.
Безпека і приватність
- JSX не виконує небезпечний код; все, що вставляється у
dangerouslySetInnerHTML, потребує ручної перевірки. - Властивості типізуються через TypeScript, що зменшує ризик runtime‑помилок.
Особливості в контексті React
- JSX є частиною React 18+; Next.js, Remix, Gatsby використовують його за замовчуванням.
- TypeScript підтримує JSX через
jsx: react-jsxу tsconfig, що генерує нові API.
Оптимізація та типові помилки
- Не використовуйте
keyу фрагментах без реального списку. - Уникайте надмірної вкладеності тегів; розділяйте логіку на підкомпоненти.
- Перевіряйте, що всі атрибути відповідають camelCase (наприклад,
className, а неclass).
Диагностика і отладка
- Якщо JSX не компілюється, перевірте налаштування Babel/TS (
@babel/preset-react). - Помилки типу «Unexpected token» часто вказують на відсутність транслятора.
Альтернативи
React.createElementбез JSX (ручний код).- Інші фреймворки: Vue‑SFC, Angular templates, Svelte.
Часті помилки (8)
- Відсутність
keyу списках → React не може правильно оновити. - Використання
classзамістьclassName→ синтаксична помилка. - Неправильне ім’я компонента (починається з маленької літери) → створює HTML‑тег.
- Не типізовані пропси у TS → runtime‑помилки.
- Вставка об’єктів без
JSON.stringify→ не відображається. - Використання
dangerouslySetInnerHTMLбез санітизації → XSS. - Перевантаження компоненту великою кількістю дочірніх елементів → низька продуктивність.
- Залишені
console.logу продакшн‑коді → збільшує розмір бандла.
Cheatsheet
- JSX →
React.createElement. - Атрибути: camelCase,
className,htmlFor. - Компонент починається з великої літери.
keyу списках.dangerouslySetInnerHTML→ санітизація.
Follow‑up питання
- Як працює
React.createElement? - Чому JSX компілюється в JavaScript‑функції?
- Які переваги типізації JSX у TypeScript?